Da sich so viele Leute auf Raymonds sprechen Ich mache es mir ein wenig leichter, indem ich aufschreibe, was er gesagt hat:
Bei den doppelten Unterstrichen ging es nicht um die Privatsphäre. Die Absicht war, sie genau so zu verwenden
class Circle(object):
def __init__(self, radius):
self.radius = radius
def area(self):
p = self.__perimeter()
r = p / math.pi / 2.0
return math.pi * r ** 2.0
def perimeter(self):
return 2.0 * math.pi * self.radius
__perimeter = perimeter # local reference
class Tire(Circle):
def perimeter(self):
return Circle.perimeter(self) * 1.25
Es ist eigentlich das Gegenteil von Privatsphäre, es geht um Freiheit. Ihre Unterklassen können eine beliebige Methode außer Kraft setzen, ohne die anderen zu beeinträchtigen. .
Angenommen, Sie behalten keine lokale Referenz von perimeter
en Circle
. Nun, eine abgeleitete Klasse Tire
übersteuert die Implementierung von perimeter
, ohne Berührung area
. Wenn Sie anrufen Tire(5).area()
sollte es theoretisch immer noch mit Circle.perimeter
für die Berechnung, aber in Wirklichkeit verwendet es Tire.perimeter
was nicht das beabsichtigte Verhalten ist. Deshalb brauchen wir eine lokale Referenz in Circle.
Aber warum __perimeter
代わりに _perimeter
? Weil _perimeter
gibt abgeleiteten Klassen immer noch die Möglichkeit, zu überschreiben:
class Tire(Circle):
def perimeter(self):
return Circle.perimeter(self) * 1.25
_perimeter = perimeter
Doppelte Unterstriche führen zu einer Namensvermischung, so dass die Wahrscheinlichkeit, dass die lokale Referenz in der übergeordneten Klasse in der abgeleiteten Klasse überschrieben wird, sehr gering ist. macht es Ihren Unterklassen möglich, eine beliebige Methode zu überschreiben, ohne die anderen zu zerstören ".
Wenn Ihre Klasse nicht vererbt wird, oder das Überschreiben von Methoden nichts kaputt macht, dann brauchen Sie einfach keine __double_leading_underscore
.
6 Stimmen
Eine tolle kurze Antwort aus einem anderen Thread: stackoverflow.com/a/8689983/911945
1 Stimmen
Siehe auch dies ausgezeichnet Hier finden Sie eine Antwort auf die Frage nach einfachen und doppelten Unterstrichen und eine Demonstration der "Namensverwechslung"! Antwort auf "Private Mitglieder in Python"