Python中的staticmethod和classmethod

谈谈Python中的staticmethod和classmethod

首先值得说明的是staticmethod和classmethod都是python中定义的装饰器,用的时候需要在前面加@

即@staticmethod和@classmethod

翻译过来staticmethod是静态方法, classmethod是类方法

下面是一个简单的例子:

>>> v2 = "I'm out of class A"
>>> class A(object):
    v1 = "I belong to class A"
    def func(self,x):
        print("executing func(%s,%s)" % (self,x))
    @classmethod
    def class_func(cls,x):
        print("executing class_func(%s,%s)" % (cls,x))
        print(cls.v1)
    @staticmethod
    def static_func(x):
        print("executing static_func(%s)" % x)
        print(v2)

        
>>> a = A()
>>> a.func(1)
executing func(<__main__.A object at 0x00000075840ECB70>,1)
>>> a.class_func(2)
executing class_func(<class '__main__.A'>,2)
I belong to class A
>>> A.class_func(3)
executing class_func(<class '__main__.A'>,3)
I belong to class A
>>> a.static_func(4)
executing static_func(4)
I'm out of class A
>>> static_func(5)
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    static_func(5)
NameError: name 'static_func' is not defined
>>> A.static_func(5)
executing static_func(5)
I'm out of class A
>>> A.v1
'I belong to class A'

 

这里有个地方值得玩味。从字面意思上,我们就可以判断,很好理解。

在class A中:

  • 没有任何装饰器修饰的函数"func",是属于对象的方法,只能访问实例的其他成员。所以func(self,x)传入的第一个参数是"self",指的是实例本身,即例子中的a。只能通过实例调用。
  • classmethod是类的方法,即上例中用@classmethod修饰的函数"class_foo",是属于类的方法,所以class_foo(cls,x)传入的第一个参数是"cls",指类本身,即例子中的A。这个方法是一个类方法,虽然属于类,需要访问类的其他成员,但是不用访问实例的其他成员。并且可以在不把类实例化的前提下,通过类名进行调用,但是值得注意的是,classmethod也可以通过实例调用。典型用途:工厂模式的实现。
  • staticmethod是静态方法,即这个方法是一个普通方法,虽然属于类,但是不用访问类和实例的其他成员。并且可以在不把类实例化的前提下,通过类名进行调用值得注意的是,staticmethod也可以通过实例调用。典型用途:工厂模式的实现。

需要特别指出的一点是,上述指出的用法是标准用法。实际上,通过class A的定义我们看到,从实际的角度看,func, class_func和static_func都是在class A定义下的,也就是说,其实这三个函数我们都可以通过A来访问,严格意义上都是属于classA的成员函数,就算对象方法func也不例外。

其实语句执行时

a.func(1)

相当于默认执行了

A.func(a,1)

以下是证明:

>>> A.func(1,2)
executing func(1,2)
>>> A.func(A,1)
executing func(<class '__main__.A'>,1)
>>> A.func(a,1)
executing func(<__main__.A object at 0x00000075840ECB70>,1)
>>> a.func(1)
executing func(<__main__.A object at 0x00000075840ECB70>,1)

 

参考链接:

1. Python中的staticmethod与classmethod

2. python中@classmethod @staticmethod区别

posted @ 2018-11-21 18:06  青山牧云人  阅读(488)  评论(0编辑  收藏  举报