PHP前端开发

基于python中staticmethod和classmethod的区别

百变鹏仔 3小时前 #Python
文章标签 区别

这篇文章主要介绍了关于基于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>&gt;print(a.class_foo)# <bound>&gt;print A.class_foo<bound>print(a.static_foo)# print(A.static_foo)# "</bound></bound></bound>

立即学习“Python免费学习笔记(深入)”;

作用

• 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似

• 有利于组织代码,同时有利于命名空间的整洁

立即学习“Python免费学习笔记(深入)”;