Sublinhado único no início:
Python não possui métodos particulares reais. Em vez disso, um sublinhado no início de um método ou nome de atributo significa que você não deve acessar esse método, porque ele não faz parte da 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)
(Este trecho de código foi retirado do código-fonte do django: django / forms / forms.py). Nesse código, errors
é uma propriedade pública, mas o método que essa propriedade chama, _get_errors, é "privado", portanto você não deve acessá-lo.
Dois sublinhados no início:
Isso causa muita confusão. Não deve ser usado para criar um método privado. Deve ser usado para evitar que seu método seja substituído por uma subclasse ou acessado acidentalmente. Vamos ver um exemplo:
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!
Resultado:
$ python test.py
I'm test method in class A
I'm test method in class A
Agora crie uma subclasse B e faça customização para o método __test
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
A saída será ....
$ python test.py
I'm test method in class A
Como vimos, A.test () não chamou os métodos B .__ test (), como poderíamos esperar. Mas, de fato, esse é o comportamento correto para __. Os dois métodos chamados __test () são renomeados automaticamente (desconfigurados) para _A__test () e _B__test (), para que não sejam substituídos acidentalmente. Quando você cria um método começando com __, significa que você não deseja que ninguém possa substituí-lo e só pretende acessá-lo de dentro de sua própria classe.
Dois sublinhados no início e no final:
Quando vemos um método como __this__
, não o chame. Este é um método que o python deve chamar, não você. Vamos dar uma olhada:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
Sempre existe um operador ou função nativa que chama esses métodos mágicos. Às vezes, é apenas um python gancho chama em situações específicas. Por exemplo, __init__()
é chamado quando o objeto é criado após __new__()
ser chamado para criar a instância ...
Vamos dar um exemplo ...
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
Para mais detalhes, consulte o guia PEP-8 . Para mais métodos mágicos, consulte este PDF .