問題

  最佳答案

也許一點示例程式碼會有幫助:注意foo,class_foostatic_foo的呼叫簽名的區別:

 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()
 

下面是物件例項呼叫方法的通常方式.物件例項 a 被隱式傳遞為第一個引數。

 a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
 

使用類方法,物件例項的類被隱式傳遞為第一個引數,而不是self

 a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
 

您也可以使用類呼叫 class_foo。 一個類方法,可能是因為您打算從類而不是從類例項呼叫它. A.foo(1)會引發TypeError,但A.class_foo(1)工作正常:

 A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
 

人們為類方法找到的一個用途是建立可繼承的替代建構函式.


使用staticmethods,self(物件例項)和cls(類)都不被默示傳遞為第一個引數.它們的行為像普通函式,除非您可以從例項或類呼叫它們:

 a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)
 

Staticmethods用於對與類有某種邏輯聯絡的函式進行組合。


foo只是一個函式,但是當你呼叫a.foo時,你不只是得到函式, 您得到一個函式的“部分應用”版本,物件例項a繫結為函式的第一個引數. foo期望2個引數,而a.foo只期望1個引數.

a繫結到foo.這是下面“繫結”一詞的意思:

 print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
 

使用a.class_foo,a不繫結到class_foo,而類A繫結到class_foo.

 print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
 

在這裡,使用static方法,即使它是一個方法,a.static_foo只返回 一個好的“ole函式,沒有引數繫結. static_foo期望1個引數, a.static_foo也期望1個引數.

 print(a.static_foo)
# <function static_foo at 0xb7d479cc>
 

當然,當您使用類A呼叫static_foo時也會發生同樣的情況。

 print(A.static_foo)
# <function static_foo at 0xb7d479cc>
 

  相同標籤的其他問題

pythonoopmethodspython-decorators