1

代碼的所需輸出是我有一個類變量Team.stuff,其中有一個條目保存b實例,並且Player.stuff變量應該爲空。相反,我得到一個錯誤......Python類繼承,__init__和cls

class Player: 
    stuff=[] 
    def __init__(self): 
    cls.stuff.append(self) 

class Team(Player): 
    def __init__(self): 
    super(Team, self).__init__() 

b=Team() 

ERROR

cls.stuff.append(self) 
NameError: global name 'cls' is not defined 

我可以通過CLS變量在Team.__init__(),但我不知道這是「正確」的方式,多重要的是Player.__init__()將需要一個類變量,我不知道如何做到這一點的語法。

回答

0

請記住,cls不是Python中的關鍵字。相反,它是一個方法的第一個參數的約定,當該方法應該是一個類函數,而不是一個在某個特定實例上調用的方法。

如果你想stuff是一個屬性的函數,你必須像這樣定義它:self.stuff=[]

然後,當您在方法中引用它時,也可以使用self關鍵字:self.stuff.append(..)

0

原因是您的__init__函數中的cls未定義。參數名稱selfcls只是命名約定。實際上,您可以分別命名爲foobar以指定實例和類別方法,foo指向類別實例,而bar則指向類別本身。

此外,self.stuff會作爲一個屬性搜索時有效,如果一個對象沒有這樣名稱的屬性在它的字典__dict__,它的類的__dict__代替看去。如果兩者都丟失,則根據mro的順序進行進一步的查找。

注意,一旦你設置屬性stuff的對象實例,它會陰影類定義。

解釋舉例:

class MyClassA(object): 
    stuff = [] 

class MyClassB(MyClassA): 
    def __init__(foobar): 
     # `foobar` points at the instance of `MyClassB` class. 

     # MyClassA.stuff gets `1` object appended to it. 
     foobar.stuff.append(1) 

     # This should print '[1]' 
     print foobar.stuff 

     # `MyClassB` object gets a _new_ attribute named `stuff` pointing at a list. 
     foobar.stuff = [] 

     # This should print '[]'. 
     print foobar.stuff 
1
class Player(object): 
    stuff=[] 
    def __init__(self): 
     self.stuff.append(self) 

class Team(Player): 
    def __init__(self): 
     super(Team, self).__init__() 

b = Team() 
print(Team.stuff) 

打印(像)

[<__main__.Team object at 0xb7519dec>] 
+0

謝謝,但不是我所需要的。我需要打印(Team.stuff),而不是打印(b.stuff) – appleLover

+0

你試過了嗎? – Matthias