2017-10-17 5 views
0

Si je lance ce en PythonPourquoi Python remappe-t-il mon nom d'attribut?

class Boo(object): 
    def __init__(self, x): 
     self._x = x 
     self.__bingo = 3 
     self._info = {'x': x, 'y':42} 
    def __dir__(self): 
     return ['x'] 
    @property 
    def x(self): 
     return self._x 
    @property 
    def z(self): 
     return self._x+1 
    def __getattr__(self, key): 
     return self._info[key] 

b = Boo(44) 
b.__dict__.keys() 

il imprime

['_info', '_Boo__bingo', '_x'] 

Pourquoi __bingo sont renommés? Les attributs de double trait de soulignement sont-ils réservés?

+0

Parce que ce * exactement ce que vous avez dit Python à faire *. Où avez-vous eu l'idée d'utiliser double-underscores? Avez-vous juste tomber sur ce comportement? Ou avez-vous suivi un tutoriel qui vous dit que les doubles caractères de soulignement sont "privés"? –

+0

Je n'ai aucun problème à ce que cela soit marqué comme un doublon, mais la [question liée] (https://stackoverflow.com/questions/7456807/python-name-mangling) n'est liée que de manière tangentielle à cette question. Il y a [une réponse à cette question] (https://stackoverflow.com/a/34903236/44330) qui répond à ma question. –

+0

@ juanpa.arrivillaga Je suis tombé sur ce comportement, et je voulais savoir pourquoi, ce qui correspond exactement à ma question. (Votre commentaire apparaît comme un peu arrogant, au fait.) –

Répondre

2

Cela a à voir avec mangling, ce que fait l'interprète de python. Voici un article à ce sujet.

https://shahriar.svbtle.com/underscores-in-python

+1

ah, ok voici l'article dans les docs: https://docs.python.org/2.7/tutorial /classes.html#tut-private –