通常来讲,要使用某个类的方法,须要先实例化一个对象再调用方法。html
而使用@staticmethod或@classmethod,就能够不须要实例化,直接类名.方法名()来调用。python
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。函数
既然@staticmethod和@classmethod均可以直接类名.方法名()来调用,那他们有什么区别呢post
从它们的使用上来看,
- @staticmethod不须要表示自身对象的self和自身类的cls参数,就跟使用函数同样。
- @classmethod也不须要self参数,但第一个参数须要是表示自身类的cls参数。
若是在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。编码
而@classmethod由于持有cls参数,能够来调用类的属性,类的方法,实例化对象等,避免硬编码。spa
下面上代码。htm
- class A(object):
- bar = 1
- def foo(self):
- print('foo')
-
- @staticmethod
- def static_foo():
- print('static_foo')
- print(A.bar)
-
- @classmethod
- def class_foo(cls):
- print('class_foo')
- print(cls.bar)
- cls().foo()
-
- A.static_foo()
- A.class_foo()
输出 static_foo 1 class_foo 1 foo