Python語言特性之3:@staticmethod和@classmethod


問題: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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM