Einzelner 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)
(Dieses Code-Snippet wurde aus dem Django-Quellcode entnommen: django / forms / forms.py). In diesem Code errors
handelt es sich um eine öffentliche Eigenschaft, aber die von dieser Eigenschaft aufgerufene Methode _get_errors ist "privat", sodass Sie nicht darauf zugreifen sollten.
Zwei Unterstriche am Anfang:
Dies führt zu großer Verwirrung. Es sollte nicht zum Erstellen einer privaten Methode verwendet werden. Es sollte verwendet werden, um zu vermeiden, dass Ihre Methode von einer Unterklasse überschrieben wird oder versehentlich darauf zugegriffen wird. Sehen wir uns ein Beispiel an:
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 __test-Methode an
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
Ausgabe wird sein ....
$ python test.py
I'm test method in class A
Wie wir gesehen haben, hat A.test () nicht wie erwartet die Methoden B .__ test () aufgerufen. Tatsächlich ist dies jedoch das richtige Verhalten für __. Die beiden Methoden mit dem Namen __test () werden automatisch in _A__test () und _B__test () umbenannt (entstellt), sodass sie nicht versehentlich überschrieben werden. Wenn Sie eine Methode erstellen, die mit __ beginnt, bedeutet dies, dass Sie nicht möchten, dass jemand sie überschreiben kann, und dass Sie nur innerhalb der eigenen Klasse darauf zugreifen möchten.
Zwei Unterstriche am Anfang und am Ende:
Wenn wir eine Methode wie sehen __this__
, rufen Sie sie nicht auf. Dies ist eine Methode, die Python aufrufen soll, nicht Sie. Lass uns mal sehen:
>>> 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 Hook, den Python in bestimmten Situationen aufruft. Wird zum Beispiel __init__()
aufgerufen, wenn das Objekt erstellt wird, nachdem __new__()
aufgerufen wurde, 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 Informationen finden Sie im PEP-8-Handbuch . Weitere magische Methoden finden Sie in diesem PDF .