Warum Pythons „private“ Methoden nicht wirklich privat sind
Trotz des doppelten Unterstrichs, der in Python üblicherweise zur Bezeichnung „privater“ Methoden verwendet wird, Diese Methoden bleiben für Benutzer über eine etwas andere Namenskonvention zugänglich.
Der Python-Interpreter benennt diese um 'private' Methoden zu "_ClassName__MethodName". Somit kann die angeblich „private“ Methode „__myPrivateMethod()“ als „_MyClass__myPrivateMethod()“ aufgerufen werden.
Diese Namensverschlüsselung ist nicht als eine Form der Kapselung oder zur Verhinderung des Zugriffs von außen gedacht. Stattdessen dient es dazu, sicherzustellen, dass Unterklassen nicht unbeabsichtigt die „privaten“ Methoden ihrer Oberklassen überschreiben.
Betrachten Sie das folgende Beispiel:
class Foo(object): def __init__(self): self.__baz = 42 def foo(self): print(self.__baz) class Bar(Foo): def __init__(self): super(Bar, self).__init__() self.__baz = 21 def bar(self): print(self.__baz)
Wenn wir eine Instanz von Bar erstellen und aufrufen Sowohl foo() als auch bar() sehen wir die folgende Ausgabe:
x = Bar() x.foo() 42 x.bar() 21
Wie aus der Ausgabe hervorgeht, wurde die Unterklasse erfolgreich ausgeführt überschreibt den Wert von __baz, ohne das „private“ Attribut der Oberklasse zu beeinflussen. Darüber hinaus zeigt der Zugriff auf x.__dict__, dass beide Versionen des __baz-Attributs innerhalb der Unterklasseninstanz koexistieren.
Während diese Namensverschlüsselung versehentliche Überschreibungen verhindern kann, verhindert sie nicht den absichtlichen Zugriff auf „private“ Methoden von externen Quellen. Folglich sind die „privaten“ Methoden von Python nicht wirklich privat und sollten nicht zur Kapselung herangezogen werden.
Das obige ist der detaillierte Inhalt vonSind die „privaten' Methoden von Python wirklich privat?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!