Warum AttributeError?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten