2016-10-21 6 views
1
class Choices(object): 
     __choices = set(["Boss"]) 

     @classmethod 
     def choices(cls): 
      return list(cls.__choices) 

class ChoicesA(Choices): 
    __choices = set(['A']) 

>> ChoicesA.choices() 

>> ['Boss'] 

Aber ich wollte ['A']Klassenmethode unter Verwendung von Klassenattribut und subclasse

Warum ist die Klassenmethode der Klasse Attribut aus der Unterklasse nicht verwenden? Ist es kein Python-Fehler? Warum verwendet Python nicht die Klassenmethode, die für die reale Klasse (die Unterklasse) angewendet wurde?

Haben Sie eine Lösung? Vielen Dank.

+0

Thanks.Ich möchte nicht das Elternattribut ändern, aber das Kind Attribut. Aber ich möchte die Methode einmal im Elternteil definieren. –

+0

fand ich eine Lösung: 'Klasse Choices (Objekt): _Choices = set ([ "Boss"]) def Auswahl @classmethod (cls): Rückgabeliste (cls._choices) Klasse ChoicesA (Auswahl) : _choices = set (['A']) ' –

Antwort

0

Try This:

class Choices(object): 
     choices_ = set(["Boss"]) 

     @classmethod 
     def choices(cls): 
      return list(cls.choices_) 

class ChoicesA(Choices): 
    choices_ = set(['A']) 

>> ChoicesA.choices() 

>> ['A'] 

Haben Sie die Änderung ??

Ich machte nur Entscheidungen öffentlich (früher war es privat).

Jetzt ist hier die Erklärung:

Wenn wir __Choices verwenden, bevor sie automatisch Ausführung Python die Namen der privaten Mitglieder ändert. So werden die Entscheidungen in Klasse A zu _A__choices und __choices in Klasse B werden zu _B__choices. Und beide werden von der Kindklasse zugänglich sein. So wird Code umgewandelt in:

class Choices(object): 
     _Choices__choices = set(["Boss"]) 

     @classmethod 
     def choices(cls): 
      return list(cls._Choices__choices) 

class ChoicesA(Choices): 
    _ChoicesA__choices = set(['A']) 

Und Sie werden ['Boss'] als Ergebnis erhalten.

Und dies wird nur getan, um zu vermeiden, die privaten Mitglieder der Elternklassen durch die Kindklasse zu überschreiben. In Python ist nichts privat und alles von der Elternklasse wird in der Kindklasse vererbt.

Sie können dies versuchen:

print(ChoicesA._ChoicesA__choices) # ['A'] 
print(ChoicesA._Choices__choices) # ['Boss'] 

Das Konzept der Umsetzung der Namen wird Mangeln genannt.

Verwandte Themen