基于python中staticmethod和classmethod的区别
这篇文章主要介绍了关于基于python中staticmethod和classmethod的区别,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
例子
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()
立即学习“Python免费学习笔记(深入)”;
上述类有三个函数,使用如下:
a.foo(1)# executing foo(<__main__.a>,1)-----------------------------------------------------------------a.class_foo(1)# executing class_foo(<class>,1)A.class_foo(1)# executing class_foo(<class>,1)-----------------------------------------------------------------a.static_foo(1)# executing static_foo(1)A.static_foo('hi')# executing static_foo(hi)</class></class></__main__.a>
立即学习“Python免费学习笔记(深入)”;
区别
• 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>>print(a.class_foo)# <bound>>print A.class_foo<bound>print(a.static_foo)# print(A.static_foo)# "</bound></bound></bound>
立即学习“Python免费学习笔记(深入)”;
作用
• 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似
• 有利于组织代码,同时有利于命名空间的整洁
立即学习“Python免费学习笔记(深入)”;