Doppelter Unterstrich in Python

8
%Vor%

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?

    
Andrew Fount 24.07.2017, 19:53
quelle

1 Antwort

7

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."

    
Dale Wilson 24.07.2017, 19:59
quelle

Tags und Links