2012-10-09 16 views
0

根據classmethod()內置函數本身的Python Standard Library本身的第二章,我對這兩個語句感到困惑,我在這裏引用: -classmethod內置函數 - 無法理解文檔中的語句

一個類的方法接收類作爲隱含的第一個參數,只是 像一個實例方法接收實例。

好了,直到這部分我很清楚,一個classmethod是特定的一類,因此,而不是採取self作爲一個隱含參數,它代表了這個類的一個實例,我們使用cls,它代表類本身,並綁定該classmethod對類..

現在,這裏這個話題這讓我感到困惑的是另一份聲明以後: -

如果一個類的方法被稱爲派生類中,派生類 對象作爲隱含的第一個參數傳遞。

現在,這是什麼意思?是否試圖說,在這種情況下,我們實際上通過an objectclassmethod?但是,這與第一個陳述本身是否矛盾?

任何人都可以讓我明白,這兩個陳述是如何攜手而不會相互矛盾?

我試圖找到一些資源,但找不到一個example,展示second case ..

+1

派生類是指兒童類,而不是實例對象 – fanlix

+0

@fanlix ..我知道這一點,但它的寫: - '派生類對象' –

+0

一個類也是一個對象。該句不是關於一個實例對象,而是關於一個類對象。 – glglgl

回答

4

一個類是一個全功能的第一類對象,就像那個類的實例一樣(儘管它們顯然不是同一個對象)。當我們說class Cclassmethod接收到「類對象」作爲第一個參數時,我們說它接收到一個表示一個對象,而不是一個對象,該對象的真實性爲isinstance(<the object>, C)。後者被稱爲(類)實例,「類對象」被保留用於對象,其中類。

第二句話只是澄清,如果在派生類上調用類方法,那麼類方法將接收該派生類(AKA「派生類對象」),以啓用多態行爲。例如(Python 3中,因爲f..k老式類):

class C: 
    x = 1 

    @classmethod 
    def m(cls): 
     return cls.x 

class D(C): 
    x = 2 

print(C.m()) # 1 
print(D.m()) # 2 
+0

@delnan ..感謝delnan ..這澄清了我的疑問.. :) –

+1

如果有人想知道,一個類對象是其元類的一個實例(默認爲'type')。 –

2
class A(object): 
    @classmethod 
    def x(cls): return cls 

class B(A): 
    pass 

print B().x() 

在這裏,我通過它的子類B調用A.x()

因此,返回從A派生的類對象B

+0

@glglgl ..這意味着,我們可以通過派生類對象調用基類的classmethod –

+0

確實如此。將使用實際實例的類對象。即使'B.x()'也是可行的,因爲類方法可以通過類和類的實例調用。 – glglgl

+0

的原因。在glglgl的代碼中,試試:bb = B(); B.x(); bb.x(); – fanlix