摘自 《Python 基础教程》 9.5.2 静态方法和类成员方法 p149
在讨论实现属性的旧方法前,先让我们绕道而行,看看另一对实现方法和新式属性的实现方法类似的特征。静态方法和类成员方法分别在创建时被装入Staticmethod类型和Classmethod类型的对象中。
静态方法的定义没有self参数,且能够被类本身直接调用。
类方法在定义时需要名为cls的类似于self的参数,类成员方法可以直接在类的具体对象中调用。但cls参数是自动被绑定到类的。
请看下面例子:
__metaclass__ = type class MyClass: def smeth(): print('This is a static method') smeth = staticmethod(smeth) def cmeth(cls): print('This is a class method of', cls) cmeth = classmethod(cmeth)
手动包装和替换方法的技术看起来有点单调。在python 2.4 中,为这样的包装方法引用了一个叫做装饰器(decorators)的新语法(它能对任何可调用的对象进行包装,既能够用于方法也能用于函数)。使用@操作符,在方法(或函数)的上方将装饰器列出,从而指定一个或者更多的装饰器(多个装饰器在应用时的顺序与指定顺序相反)。
__metaclass__ = type class MyClass: @staticmethod def smeth(): print('This is a static method') @classmethod def cmeth(cls): print('This is a class method of', cls) def meth(self): print('This is a instance method of', self) MyClass.smeth() MyClass.cmeth() MyClass().meth()
结果:
This is a static method ('This is a class method of', <class __main__.MyClass at 0x7f54fc8b81f0>) ('This is a instance method of', <__main__.MyClass instance at 0x7f54fc8d3950>)
此处让我明白装饰器存在的作用,是为了简化语法。
静态方法和类成员方法在python中并不是向来都很重要,主要的原因是大部分情况下可以使用函数或者绑定方法代替。在早期的版本中没有得到支持也是一个原因。但即使看不到两者在当前代码中的大量应用,也不要忽视静态方法和类成员方法的应用(比如工厂函数),可以好好地考虑一下使用新技术。