staticmethod与classmethod区别
参考
- https://*.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python
- http://blog.csdn.net/handsomekang/article/details/9615239
例子
class A(object):
def foo(self,x):
print "executing foo(%s,%s)"%(self,x)
@classmethod
def class_foo(cls,x):
print "executing class_foo(%s,%s)"%(cls,x)
@staticmethod
def static_foo(x):
print "executing static_foo(%s)"%x
a=A()
上述类有三个函数,使用如下:
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
-----------------------------------------------------------------
a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
-----------------------------------------------------------------
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
区别
foo()
的调用者必须是类A
的一个实例,class_foo()
与static_foo()
的调用者既可以是类也可以是某个实例参数不同,
foo()
参数为self和其他参数,class_foo()
参数使用类(cls)替换了self,static_foo()
则只有参数,没有self和类(cls)-
a.foo(1)
中的foo()
与a是绑定的,class_foo()
是与类绑定的,而static_foo()
与这两者都没有绑定,可以使用print
来查看,如下:print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>> print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>> print A.class_foo
<bound method classobj.class_foo of <class __main__.A at 0x105efedb8>> print(a.static_foo)
# <function static_foo at 0xb7d479cc>
print(A.static_foo)
# <function static_foo at 0xb7d479cc>
作用
- 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似
- 有利于组织代码,同时有利于命名空间的整洁