Variables privées et méthodes en Python [dupliquer]
possibilité de dupliquer:
la signification d'un simple-et d'un double-soulignement devant un nom d'objet en Python
qui devrais-je utiliser _foo (un underscore) ou __bar (double underscore) pour les membres privés et les méthodes en Python?
4 réponses
veuillez noter qu'il n'existe pas de" méthode privée " en Python. Double underscore est juste nom mangling:
>>> class A(object):
... def __foo(self):
... pass
...
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()
donc le préfixe __
est utile lorsque vous avez besoin de la modification pour se produire, par exemple pour ne pas entrer en conflit avec des noms en haut ou en bas de la chaîne de transmission. Pour d'autres utilisations, un simple underscore serait mieux, IMHO.
EDIT, concernant la confusion sur __
, PEP-8 est très clair sur que:
si votre classe est destinée à être sous-classée, et que vous avez des attributs que vous ne voulez pas de sous-classes à utiliser, envisager de les nommer avec double tête souligne et aucun arrière souligne. Cela invoque Nom de Python mangling algorithme, où le nom de la classe est mutilé dans le nom de l'attribut. cela permet d'éviter le nom d'attribut les collisions devraient-elles contenir par inadvertance des attributs même nom.
Note 3: Pas tout le monde aime nom mangling. Essayez d'équilibrer le nécessité d'éviter les conflits accidentels entre le nom et l'utilisation potentielle par avancée des appelants.
donc si vous ne vous attendez pas à ce que la sous-classe redéfinisse accidentellement sa propre méthode avec le même nom, ne l'utilisez pas.
Le double trait de soulignement. Il altère le nom d'une manière telle qu'il ne peut pas être accédé simplement par __fieldName
de l'extérieur de la classe, ce qui est ce que vous voulez commencer par s'ils doivent être privés. (Bien qu'il ne soit pas très difficile d'accéder au terrain.)
class Foo:
def __init__(self):
self.__privateField = 4;
print self.__privateField # yields 4 no problem
foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'
il sera accessible par _Foo__privateField
à la place. Mais il crie: "je suis soldat, ne me touchez pas", ce qui est mieux que rien.
trait de soulignement Double. Que mangles le nom. La variable est toujours accessible, mais c'est généralement une mauvaise idée de le faire.
utilisez des underscores simples pour semi-privé (dit aux développeurs python" ne changez cela que si vous devez absolument") et doubles pour entièrement privé.