Souligné unique au début:
Python n'a pas de véritables méthodes privées. Au lieu de cela, un trait de soulignement au début d'un nom de méthode ou d'attribut signifie que vous ne devez pas accéder à cette méthode, car elle ne fait pas partie de l'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)
(Cet extrait de code a été extrait du code source de django: django / forms / forms.py). Dans ce code, errors
est une propriété publique, mais la méthode que cette propriété appelle, _get_errors, est "privée", vous ne devez donc pas y accéder.
Deux soulignements au début:
Cela provoque beaucoup de confusion. Il ne doit pas être utilisé pour créer une méthode privée. Il doit être utilisé pour éviter que votre méthode soit remplacée par une sous-classe ou accédée accidentellement. Voyons un exemple:
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!
Production:
$ python test.py
I'm test method in class A
I'm test method in class A
Créez maintenant une sous-classe B et personnalisez la méthode __test
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
La sortie sera ....
$ python test.py
I'm test method in class A
Comme nous l'avons vu, A.test () n'a pas appelé les méthodes B .__ test (), comme on pourrait s'y attendre. Mais en fait, c'est le comportement correct pour __. Les deux méthodes appelées __test () sont automatiquement renommées (mutilées) en _A__test () et _B__test (), de sorte qu'elles ne remplacent pas accidentellement. Lorsque vous créez une méthode commençant par __, cela signifie que vous ne voulez pas que quiconque puisse la remplacer, et vous avez uniquement l'intention d'y accéder depuis l'intérieur de sa propre classe.
Deux soulignements au début et à la fin:
Quand nous voyons une méthode comme __this__
, ne l'appelez pas. C'est une méthode que python est censé appeler, pas vous. Nous allons jeter un coup d'oeil:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
Il y a toujours un opérateur ou une fonction native qui appelle ces méthodes magiques. Parfois, c'est juste un appel de python dans des situations spécifiques. Par exemple, __init__()
est appelé lorsque l'objet est créé après __new__()
est appelé pour construire l'instance ...
Prenons un exemple ...
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
Pour plus de détails, consultez le guide PEP-8 . Pour plus de méthodes magiques, voir ce PDF .