先看个简单代码
class CText:
a = 2 # 类属性
# 实例方法
def normal_method(self):
return self.a
# 静态方法
@staticmethod
def static_method(a):
return a # 无法访问上面的a(即类属性)
# 类方法
@classmethod
def class_method(cls):
return cls.a
if __name__ == '__main__':
ctext = CText() # 类的实例化
print(ctext.normal_method()) # 类的实例方法通过实例调用
print(ctext.static_method(3)) # 类的静态方法通过实例调用
print(ctext.class_method()) # 类的类方法通过实例调用
ctext.a = 5 # 改变类属性
print(ctext.normal_method()) # 类的实例方法通过实例调用
print(CText.static_method(3)) # 类的静态方法通过类调用
print(CText.class_method()) # 类的类方法通过类调用
结果:
2
3
2
5
3
2
*
结论
实例方法:1,只能通过实例来调用 2,相应的类属性随着实例的改变而改变
静态方法:1,可以通过实例调用也可以通过类直接调用 2,无法访问类属性
类方法:1,可以通过实例调用也可以通过类直接调用 2,可以访问类属性,且类属性不随实例的改变而改变