Одно подчеркивание в начале:
Python не имеет реальных частных методов. Вместо этого, одно подчеркивание в начале имени метода или атрибута означает, что вы не должны обращаться к этому методу, потому что он не является частью API.
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)
(Этот фрагмент кода был взят из исходного кода django: django / forms / forms.py). В этом коде errors
это открытое свойство, но метод, который вызывает это свойство, _get_errors, является «частным», поэтому вы не должны обращаться к нему.
Два подчеркивания в начале:
Это вызывает много путаницы. Он не должен использоваться для создания частного метода. Он должен использоваться, чтобы избежать переопределения вашего метода подклассом или случайного доступа. Давайте посмотрим на пример:
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!
Вывод:
$ python test.py
I'm test method in class A
I'm test method in class A
Теперь создайте подкласс B и выполните настройку для метода __test.
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
Выходной будет ....
$ python test.py
I'm test method in class A
Как мы уже видели, A.test () не вызывал методы B .__ test (), как мы могли ожидать. Но на самом деле это правильное поведение для __. Два метода с именем __test () автоматически переименовываются (искажаются) в _A__test () и _B__test (), поэтому они не переопределяются случайно. Когда вы создаете метод, начинающийся с __, это означает, что вы не хотите, чтобы кто-либо мог его переопределить, и вы намереваетесь получить к нему доступ только из его собственного класса.
Два подчеркивания в начале и в конце:
Когда мы видим такой метод __this__
, не вызывайте его. Это метод, который Python должен вызывать, а не вы. Давайте взглянем:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
Всегда есть оператор или нативная функция, которая вызывает эти магические методы. Иногда это просто зацепка вызовов Python в определенных ситуациях. Например, __init__()
вызывается при создании объекта после __new__()
вызова для создания экземпляра ...
Давайте возьмем пример ...
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
Для получения дополнительной информации см. Руководство PEP-8 . Дополнительные магические методы смотрите в этом PDF .