Einfacher Unterstrich am Anfang:
Python hat keine echten privaten Methoden. Stattdessen bedeutet ein Unterstrich am Anfang eines Methoden- oder Attributnamens, dass Sie nicht auf diese Methode zugreifen sollten, da sie nicht Teil der API ist.
class BaseForm(StrAndUnicode):
def _get_errors(self):
"Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors
errors = property(_get_errors)
(Dieser Codeschnipsel stammt aus dem Quellcode von django: django/forms/forms.py). In diesem Code, errors
ist eine öffentliche Eigenschaft, aber die Methode, die diese Eigenschaft aufruft, _get_errors, ist "privat", so dass Sie nicht darauf zugreifen sollten.
Zwei Unterstriche am Anfang:
Dies führt zu einer Menge Verwirrung. Es sollte nicht verwendet werden, um eine private Methode zu erstellen. Sie sollte verwendet werden, um zu verhindern, dass Ihre Methode von einer Unterklasse überschrieben oder versehentlich aufgerufen wird. Lassen Sie uns ein Beispiel sehen:
class A(object):
def __test(self):
print "I'm a test method in class A"
def test(self):
self.__test()
a = A()
a.test()
# a.__test() # This fails with an AttributeError
a._A__test() # Works! We can access the mangled name directly!
Ausgabe:
$ python test.py
I'm test method in class A
I'm test method in class A
Erstellen Sie nun eine Unterklasse B und passen Sie die Methode __test an
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
Die Ausgabe lautet....
$ python test.py
I'm test method in class A
Wie wir gesehen haben, hat A.test() nicht die Methoden von B.__test() aufgerufen, wie man erwarten könnte. Tatsächlich ist dies aber das richtige Verhalten für __. Die beiden Methoden mit dem Namen __test() werden automatisch in _A__test() und _B__test() umbenannt, damit sie nicht versehentlich überschrieben werden. Wenn Sie eine Methode erstellen, die mit __ beginnt, bedeutet das, dass Sie nicht wollen, dass irgendjemand sie überschreiben kann, und dass Sie nur innerhalb ihrer eigenen Klasse auf sie zugreifen wollen.
Zwei Unterstriche am Anfang und am Ende:
Wenn wir eine Methode wie __this__
rufen Sie nicht an. Dies ist eine Methode, die Python aufrufen soll, nicht Sie. Schauen wir uns das mal an:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
Es gibt immer einen Operator oder eine native Funktion, die diese magischen Methoden aufruft. Manchmal ist es nur ein Haken, den Python in bestimmten Situationen aufruft. Zum Beispiel __init__()
wird bei der Erstellung des Objekts aufgerufen, nachdem __new__()
wird aufgerufen, um die Instanz zu erstellen...
Nehmen wir ein Beispiel...
class FalseCalculator(object):
def __init__(self, number):
self.number = number
def __add__(self, number):
return self.number - number
def __sub__(self, number):
return self.number + number
number = FalseCalculator(20)
print number + 10 # 10
print number - 20 # 40
Weitere Einzelheiten finden Sie in der PEP-8-Leitfaden . Für weitere magische Methoden, siehe dieses PDF .
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"