Warum print(A()._m())
druckt None
, aber print(B()._m())
erhöht AttributeError: 'B' object has no attribute '_B__get'
?
Ich dachte, dass doppelter Unterstrich das Überschreiben von Methoden verhindert.
AKTUALISIEREN
Sie schreiben, dass __get
privat ist.
Warum funktioniert dann Folgendes?
%Vor% Warum erhöht dieser Code AttributeError
nicht und druckt None
zwei Mal?
Führende doppelte Unterstrichnamen sind private
(dh nicht für abgeleitete Klassen verfügbar)
Dies ist nicht narrensicher. Es wird implementiert, indem der Name gemangelt wird. Python-Dokumentation sagt:
Jeder Bezeichner des Formulars __spam (mindestens zwei führende Unterstriche, höchstens ein abschließender Unterstrich) wird textuell durch ersetzt _classname__spam, wobei Klassenname der aktuelle Klassenname ist, wobei die führenden Unterstriche entfernt werden. Dieses Mangeln geschieht ohne Rücksicht zu der syntaktischen Position des Identifizierers, so kann es verwendet werden Definieren Sie klassenprivate Instanz- und Klassenvariablen, Methoden und Variablen in globalen Variablen gespeichert und sogar Variablen in Instanzen gespeichert. privat zu Diese Klasse für Instanzen anderer Klassen.
Somit wird __get
tatsächlich zu _A__get
in Klasse A verfälscht. Wenn Klasse B versucht, __get
zu referenzieren, wird sie zu _B__get
verfälscht, was nicht übereinstimmt.
Mit anderen Worten bedeutet __plugh, definiert in der Klasse Xyzzy, "wenn du nicht als Klasse Xyzzy rennst, sollst du den __plugh nicht berühren."
Tags und Links python