类方法
通过@classmethod装饰器实现
class A(object):bar = 1@classmethoddef class_foo(cls):print 'Hello, ', clsprint cls.bar>>> A.class_foo() # 直接通过类来调用方法
Hello, <class '__main__.A'>
1
在上面,我们使用了 classmethod 装饰方法 class_foo,它就变成了一个类方法,class_foo 的参数是 cls,代表类本身,当我们使用 A.class_foo() 时,cls 就会接收 A 作为参数。另外,被 classmethod 装饰的方法由于持有 cls 参数,因此我们可以在方法里面调用类的属性、方法,比如 cls.bar
静态方法
@staticmethod 装饰器实现
class A(object):bar = 1@staticmethoddef static_foo():print 'Hello, ', A.bar>>> a = A()
>>> a.static_foo()
Hello, 1
>>> A.static_foo()
Hello, 1
可以看到,静态方法没有 self 和 cls 参数,可以把它看成是一个普通的函数。
总结
1、从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
2、实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
3、静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用