Python中@staticmethod和@classmethod的作用和区别
简单介绍一下两者的区别:
对于一般的函数test(x),它跟类和类的实例没有任何关系,直接调用test(x)即可
#!/usr/bin/python # -*- coding:utf-8 -*- def foo(x): print "running (%s)" % x foo("test")
对于普通的类,来调类中的函数:
#!/usr/bin/python # -*- coding:utf-8 -*- class A: def test(self, x): print "running (%s, %s)" % (self, x) a = A() a.test("test")
当我们需要和类直接进行交互,而不需要和实例进行交互时,类方法是最好的选择。
类方法与实例方法类似,但是传递的不是类的实例,而是类本身,第一个参数是cls。我们可以用类的实例调用类方法,也可以直接用类名来调用。
#!/usr/bin/python # -*- coding:utf-8 -*- class A: class_attr = "test" def __init__(self): pass @classmethod def class_test(cls): print "running class_test(%s)" % (cls.class_attr) a = A() a.class_test() A.class_test()
静态方法类似普通方法,参数里面不用self。这些方法和类相关,但是又不需要类和实例中的任何信息、属性等等。
如果把这些方法写到类外面,这样就把和类相关的代码分散到类外,使得之后对于代码的理解和维护都是巨大的障碍。而静态方法就是用来解决这一类问题的。
比如我们检查是否开启了日志功能,这个和类相关,但是跟类的属性和实例都没有关系。
#!/usr/bin/python # -*- coding:utf-8 -*- log_enabled = True class A: class_attr = "attr" def __init__(self): pass @staticmethod def static_test(): if log_enabled: print("log is enabled") else: print("log is disabled") A.static_test()
天下难事,必作于易;天下大事,必作于细