Subrayado simple al principio:
Python no tiene métodos privados reales. En cambio, un guión bajo al comienzo de un método o nombre de atributo significa que no debe acceder a este método, porque no es parte de la 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 fragmento de código se tomó del código fuente de django: django / forms / forms.py). En este código,errors
es una propiedad pública, pero el método al que llama esta propiedad, _get_errors, es "privado", por lo que no debe acceder a ella.
Dos guiones bajos al principio:
Esto causa mucha confusión. No debe usarse para crear un método privado. Debe usarse para evitar que una subclase anule su método o acceda accidentalmente. Veamos un ejemplo:
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!
Salida:
$ python test.py
I'm test method in class A
I'm test method in class A
Ahora cree una subclase B y personalice el método __test
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
La salida será ...
$ python test.py
I'm test method in class A
Como hemos visto, A.test () no llamó a los métodos B .__ test (), como podríamos esperar. Pero, de hecho, este es el comportamiento correcto para __. Los dos métodos llamados __test () se renombran automáticamente (mutilados) a _A__test () y _B__test (), por lo que no se anulan accidentalmente. Cuando crea un método que comienza con __ significa que no quiere que nadie pueda anularlo, y solo tiene la intención de acceder desde su propia clase.
Dos guiones bajos al principio y al final:
Cuando vemos un método como __this__
, no lo llames. Este es un método que Python debe llamar, no tú. Vamos a ver:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
Siempre hay un operador o una función nativa que llama a estos métodos mágicos. A veces es solo un gancho que Python llama en situaciones específicas. Por ejemplo, __init__()
se llama cuando se crea el objeto después de que __new__()
se llama para construir la instancia ...
Tomemos un ejemplo ...
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 más detalles, consulte la guía PEP-8 . Para más métodos mágicos, vea este PDF .