方法
普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
- 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将该类赋给cls;
- 静态方法:由类调用;无默认参数;
class Foo(object):
def __init__(self,name):
self.name = name
def ord_func(self):
print("普通方法")
@classmethod
def class_func(cls):
"""定义类方法,至少一个cls参数"""
print("类方法")
@staticmethod
def static_func():
"""定义静态方法,无默认参数"""
print("静态方法")
#调用普通方法
f = Foo('wupeiqi')
f.ord_func()
#调用类方法(类方法只能通过cls访问类属性)
Foo.class_func()
#调用静态方法(一个通过类调用的普通函数,不能直接访问类的任何属性或方法)
Foo.static_func()
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。
属性方法
@property装饰器可以使被装饰的方法成为一个属性,类似其他语言的get方法
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property #实例.score 调用
def score(self):
return self.__score
@score.setter #实例.score = value 调用
def score(self,score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
@score.deleter #del 实例.score 调用
def score(self):
del self.__score
print("score is deleted")
s = Student('Bob',59)
s.score = 60 #将60 赋给score 1
print(s.score)
# s.score = 1000 #将会触发异常 2
del s.score
60
score is deleted
从上面可以看出,通过@property装饰的属性方法能够对属性封装更多想要的操作