2010-07-20 14 views
5

Possible en double:
private members in pythonsimulent des variables privées en python

J'ai quelques variables que je veux vraiment cacher parce qu'ils ne sont pas en dehors de ma classe. De plus, toutes ces variables non documentées rendent l'héritage inutile.

Comment cacher ces variables que vous ne voulez pas montrer en dehors de votre objet?

Pour expliquer pourquoi j'ai besoin des variables privées, d'abord un exemple où l'incapacité de cacher les variables est juste un inconvénient, puis une autre qui est vraiment un problème:

class MyObject(object): 
    def __init__(self, length): 
     self.length = length 
    def __len__(self): 
     return length 

item = MyObject(5) 
item.length 
len(item) 

J'ai deux façons d'accès « longueur 'de l'article ici. C'est seulement un inconvénient et rien d'horrible.

from wares import ImplementationSpecific 

class MyThing(object): 
    def __init__(self): 
     self.__no_access_even_if_useful = ImplementationSpecific() 
    def restricted_access(self): 
     return self.__no_access_even_if_useful.mutable_value 

thing = MyThing() 
thing.restricted_access() 
thing._MyThing__no_access_even_if_useful.something_useful_for_someone() 

Alors que je veux changer la mise en œuvre un jour .. Les chances sont que ça va casser quelque chose à moins que je suis vraiment enterré les détails de mise en œuvre.

Je vais le prendre comme n'importe qui pourrait programmer. Ce «n'importe qui» peut trouver une chose utile à partir de mes spécificités d'implémentation et l'utiliser, même si je me serais fortement découragé de le faire! Il serait beaucoup plus facile de simplement dire: "Non, ce n'est pas là, essayez autre chose."

+1

Vous voulez que les variables ne héritent pas, correct? –

+1

Paul: correct .. – Cheery

+7

Python ne fait pas de servitude et de domination comme le font certaines langues. Si vous ne pouvez pas vous empêcher d'utiliser '_method' ou' _datum' (voir DrDee ci-dessous), vous méritez ce que vous obtenez (ou n'obtenez pas (ou ne cassez pas)). – msw

Répondre

14

Les variables privées est couvert dans le Python documentation:

9,6. Variables privées

Les variables d'instance "privées" auxquelles on ne peut accéder que depuis l'intérieur d'un objet n'existent pas en Python. Cependant, il existe une convention suivie de la plupart des codes Python: un nom précédé d'un trait de soulignement (par exemple _spam) doit être traité comme une partie non publique de l'API (qu'il s'agisse d'une fonction, d'une méthode ou d'un membre de données) . Il devrait être considéré comme un détail de mise en œuvre et sujet à changement sans préavis.

Résumé: utilisez un trait de soulignement avant le nom.

11

De l'Python docs:

variables d'instance « privées » qui ne sont pas accessibles, sauf à l'intérieur d'un objet n'existe pas en Python. Cependant, il existe une convention suivie de la plupart des codes Python: un nom précédé d'un trait de soulignement (par exemple _spam) doit être traité comme une partie non publique de l'API (qu'il s'agisse d'une fonction, d'une méthode ou d'un membre de données) . Il devrait être considéré comme un détail de mise en œuvre et sujet à changement sans préavis.

+0

mmmmmm 20 secondes trop tard :) – DrDee

+0

Je suis assez sûr que M. Byers vit dans un univers alternatif à environ 10 secondes d'avance sur le nôtre. ;) – msw

+0

intéressant, meta physique au travail comme Byers a répondu à la question avant que je l'ai fait .. – DrDee

Questions connexes