1

La sortie désirée du code est que j'ai une variable de classe Team.stuff qui a une entrée contenant l'instance b, et la variable Player.stuff doit être vide. Au lieu de cela, je reçois une erreur ...Python, classe Inheritance, __init__ et cls

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

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

b=Team() 

erreur

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

je pourrais passer la variable cls dans le Team.__init__(), mais je ne suis pas sûr que ce soit la façon « correcte », et plus important, le Player.__init__() aurait besoin d'une variable de classe, et je ne suis pas sûr de la syntaxe sur la façon de le faire. Rappelez-vous que cls n'est pas un mot clé en Python.

Répondre

0

Il s'agit plutôt d'une convention pour le premier argument d'une méthode lorsque cette méthode est supposée être une fonction de classe et non une fonction appelée sur une instance particulière de quelque chose.

Si vous voulez stuff être un attribut d'une fonction, vous devez définir comme ceci: self.stuff=[].

Et puis, lorsque vous vous y référez dans des méthodes, faites-le avec le mot-clé self: self.stuff.append(..).

0

La raison en est que cls dans votre fonction __init__ n'est pas définie. Les noms d'arguments self et cls ne sont que conventions de dénomination. En réalité, vous pourriez les nommer foo et bar respectivement pour une instance et une méthode de classe, et foo pointerait sur l'instance de classe tandis que bar pointerait la classe elle-même.

De plus, self.stuff serait valable que lors de la recherche d'un attribut, si un objet ne dispose pas d'un attribut de ce nom dans son __dict__ dictionnaire, le __dict__ de sa catégorie est regardé à la place. Si les deux sont manquants, d'autres recherches sont effectuées conformément à l'ordre mro.

Notez que, une fois que vous mis un attribut stuff sur une instance d'objet, il ombre la définition de classe.

par exemple Expliqué:

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) 

impressions (quelque chose comme)

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

Merci, mais ce n'est pas ce que je dois. J'ai besoin d'imprimer (Team.stuff), pas d'imprimer (b.stuff) – appleLover

+0

L'avez-vous essayé? – Matthias