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?

65
demandé sur Community 2010-08-02 09:46:54

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.

67
répondu Daniel Kluev 2010-08-02 06:13:40

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.

35
répondu zneak 2010-08-02 05:57:06

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é.

9
répondu user407896 2010-08-02 05:51:51

parce que c'est la convention de codage. Voir ici pour plus d'informations.

-4
répondu Zaki 2010-08-02 05:52:29