2010-05-22 5 views
0

Dans le tutoriel python ajouté que python ne peut pas cacher ses attributs d'autres classes. quelque chose comme des données privées en C++ ou java..Mais aussi je sais que nous pouvons utiliser _ ou __ pour définir certaines variables comme un privé mais ce n'est pas enogh. Je pense que c'est un faible si ce n'est pas quelque chose à faire.informations se cachant dans python

+0

Qu'est-ce que "Je pense que c'est une semaine si ce n'est pas une chose à faire". signifier? –

+3

Et la question est? – doublep

+0

Marcelo: Je pense que c'est peut-être "Je pense qu'il est faible s'il n'y a aucun moyen de cacher l'information". – Vatine

Répondre

4

Cela fait partie de la philosophie de Python. En gros, il vous fait confiance pour être prudent et faire preuve de prudence avec tout ce qui commence par un trait de soulignement. Si vous voulez vraiment cacher l'état afin que personne ne peut le toucher, vous pouvez le faire:

def fort_knox(): 
    # A very private variable 
    gold = [0] 

    class impl(object): 
     def add_gold(self, amt): 
      gold[0] += amt 

     def remove_gold(self, amt): 
      raise Exception('No withdrawals!') 

     def count_gold(self): 
      return gold[0] 

    return impl() 
+4

'lol. fort_knox(). add_gold.im_func.func_closure [0] .cell_contents -> [0] ' –

+1

@Longpoke: Mignon. Je suppose que "fort_knox" n'est pas aussi impénétrable que nous avons été amenés à le croire. –

+3

N'élève jamais 'Exception' directement, car il ne peut pas être pris en compte. Au lieu de cela, soulevez une exception plus spécifique. –

4

L'encapsulation de données en Python est appliquée par convention et révision par les pairs. Étonnamment, avoir tous les attributs effectivement public n'a pas causé de problème pour la majorité des programmeurs Python.

4

En utilisant un trait de soulignement au début du nom d'un élément ou un signal de méthode au lecteur que ce qu'ils sont en regardant est "détails de mise en œuvre interne". S'ils veulent utiliser cela, ils le peuvent, mais il est très probable qu'une nouvelle version de la classe ne conserve pas l'API pour la méthode ou les éléments internes seulement (eh, "slots", je suppose, les variables d'instance). En ayant des garanties imposées par le compilateur sur ce qui est visible et non visible, vous êtes plus sûr que les parties externes ne regardent pas les bits internes, mais même en C++, il n'est pas si difficile d'accéder aux choses privées. En pratique, aussi longtemps que vous faites confiance aux gens de ne pas faire des choses stupides, il n'y a aucun problème à avoir "ceci est interne, ne touchez pas" comme un rappel poli plutôt qu'impliqué.

+0

De plus, en C++, le mécanisme de dissimulation ne fournit pas d'encapsulation contre les changements d'implémentation, d'où l'idiome de pimpl –

1

Vous avez raison que la convention _foo n'est pas suffisante pour rendre les données privées; ce n'est pas censé être! La dissimulation d'informations ne fait pas partie de la conception de Python. Lorsque vous écrivez des programmes en Python, vous dépendez des bonnes manières de l'appelant de laisser vos éléments internes en fonction de la convention de nommage et de votre documentation. N'essayez pas d'exercer plus de contrôle que cela; nous sommes tous des adultes consentants.

Il existe une convention de dénomination des méthodes d'utilisation interne telles que _foo avec un seul trait de soulignement principal; cela sert plus de fins de documentation que toute autre chose. Python nom-mangles __foo attributs. Certaines personnes pensent que cela les rend plus privées, mais cela ne les rend pas du tout privées, bien que cela rende vos classes plus difficiles à utiliser, à étendre et à tester. Je ne les utilise jamais.

Questions connexes