問題:Python中@staticmethod
和@classmethod
兩種裝飾器裝飾的函數有什么不同?
原地址:http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python
Python其實有3類方法:
- 靜態方法(staticmethod)
- 類方法(classmethod)
- 實例方法(instance method)
看一下下面的示例代碼:
def foo(x):
print "executing foo(%s)" %(x)
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()
在示例代碼中,先理解下函數里面的self和cls。這個self和cls是對類或者實例的綁定,對於一般的函數來說我們可以這么調用foo(x)
,這個函數就是最常用的,它的工作和任何東西(類、實例)無關。對於實例方法,我們知道在類里每次定義方法的時候都需要綁定這個實例,就是foo(self,x)
,為什么要這么做呢?因為實例方法的調用離不開實例,我們需要把實例自己傳給函數,調用的時候是這樣的a.foo(x)
(其實是foo(a,x)
)。類方法一樣,只不過它傳遞的是類而不是實例,A.class_foo(x)
。注意這里的self和cls可以替換別的參數,但是python的約定是這兩個,盡量不要更改。
對於靜態方法其實和普通的方法一樣,不需要對誰進行綁定,唯一的區別是調用時候需要使用a.static_foo(x)
或A.static_foo()
來調用。
\ | 實例方法 | 類方法 | 靜態方法 |
---|---|---|---|
a = A() | a.foo(x) | a.class_foo(x) | a.static_foo(x) |
A | 不可用 | A.clas_foo(x) | A.static_foo(x) |