Seite 1 von 1

Warum AttributeError?

Verfasst: Donnerstag 13. September 2018, 14:39
von Kebap
Ich dachte, Python versteckt seine "versteckten" Attribute gar nicht wirklich?!

Code: Alles auswählen

class Spam:
  __egg = 7
print(Spam.__egg)
AttributeError in Zeile 4: Es gibt kein Attribut "__egg"

Code: Alles auswählen

class Spam:
  __egg = 7
s = Spam()
print(s.__egg)
AttributeError in Zeile 4: Es gibt kein Attribut "__egg"

Code: Alles auswählen

class Spam:
  egg = 7
print(Spam.egg)
Ohne die Unterstriche funktioniert es und zeigt 7 an

Code: Alles auswählen

class Spam:
  egg = 7
s = Spam()
print(s.egg)
Auch für ein einzelnes Exemplar funktioniert er ohne die Unterstriche

Habe ich hier etwas verpasst?

Re: Warum AttributeError?

Verfasst: Donnerstag 13. September 2018, 14:44
von __blackjack__
Ja, Du hast verpasst in der Dokumentation nachzulesen was da tatsächlich passiert. Der Name wird auf Exemplaren nach einem dokumentierten Muster verändert. Schau Dir für den ersten Fall mal die Rückgabe von ``dir(Spam())`` an, dann siehst Du wie das Attribut dann heisst.

Der Mechanismus ist nicht zum Verstecken von Namen gedacht, sondern um Namenskollisionen bei Mehrfachvererbung zu vermeiden. Oder bei tiefen Vererbungshierarchien. Beides kommt in der Praxis kaum vor, darum gibt es auch fast keinen Grund doppelte führende Unterstriche zu verwenden.

Re: Warum AttributeError?

Verfasst: Donnerstag 13. September 2018, 15:03
von Kebap
Danke, blackjack. Falls sich noch jemand wundert: https://docs.python.org/3/tutorial/clas ... -variables

Code: Alles auswählen

class Spam:
  __egg = 7
print(Spam._Spam__egg)
bzw.

Code: Alles auswählen

class Spam:
  __egg = 7
s = Spam()
print(s._Spam__egg)