Les données se Cachant dans Python Classe
Je sais que les attributs de la classe qui sont déclarées par un double soulignement __
préfixe peut ou peut ne pas être visible à l'extérieur de la définition de la classe. Comme on peut toujours accéder à ces attributs par object._className__attrName
.
class A:
def __init__(self):
self.a = 1
self.b = 2
----
----
self.z = 26
self.catch = 100
Maintenant pour protéger tous les attributs à l'exception de l'attribut catch
, je dois les déclarer avec double underscore qui est assez salissant. Est-il possible que je peux dire, dans ma définition de la classe que seulement self.catch
peut être consulté à l'extérieur de la classe?
Excuses si cela est répondu quelque part d'autre ou discuté plus tôt.
Pas de. Toutefois, sauf si vous êtes vraiment paranoïaque, le fait que quelqu'un accéder à un objet à l'aide de
double possible de python ont des "privés" des variables dans les classes?
ce n'est pas ce qu'il demande. Il veut la nécessité expresse de "public", "opérateur", et non l'inverse.
Avez-vous vraiment besoin de double underscore? Pourquoi ne pas simplement utiliser le plus simple standard trait de soulignement
object._className__attrName
n'est pas une grosse affaire. Vraiment vous voulez juste pour empêcher les gens d'accéder accidentellement à des variables qu'ils ne devraient pas lors de l'utilisation de votre code. L'obscurcissement atteint cet objectif.double possible de python ont des "privés" des variables dans les classes?
ce n'est pas ce qu'il demande. Il veut la nécessité expresse de "public", "opérateur", et non l'inverse.
Avez-vous vraiment besoin de double underscore? Pourquoi ne pas simplement utiliser le plus simple standard trait de soulignement
self._a
?
OriginalL'auteur Aamir Adnan | 2012-01-26
Vous devez vous connecter pour publier un commentaire.
Oui, il est possible de cacher des données privées par une fermeture -- au moins, si il y a un moyen d'accéder à
private
de l'extérieurmake_A
, je n'ai pas trouvé:Avis que
private
n'est pas dansdir(a)
Bien que c'est possible, je ne pense pas que c'est recommandable façon de programmer en Python.
Ci-dessus,
private
est partagée par toutes les instances deA
. Utilisation de données privées par exemple de base, ajouterself
à la dict clés:Thumbs up pour *fermetures. Cela peut être intéressant: Secret Variables que j'Python. Il compare les données fonctionnelles cacher en Python avec salle de variables en Java.
OriginalL'auteur unutbu
Alors que l'on a accepté de répondre par
unutbu
ressemble à une bonne idée de cacher des données, laprivate
dictionnaire encore accessibles à l'aide de__closure__
(cet attribut ne peut pas être supprimé):Ou en suivant le lien fourni par
Sumukh Barve
dans les commentaires:Je bevile la seule façon de créer
private
attributs est d'écrire une sorte deCPython
extension.OriginalL'auteur Ceppo93
Non, puisque c'est une partie du nom, vous ne pouvez pas le faire.
Bien, en fait, vous pouvez par l'intermédiaire de piratage avec les getters/setters, mais en général, vous ne devriez pas.
OriginalL'auteur Teo Klestrup Röijezon
Pourquoi pourriez-vous souhaitez protéger les attributs?
Si vous voulez protéger les attributs de l'écrasement par inadvertance, utilisez le double soulignement et, probablement, prêt-seules les propriétés afin de rendre l'accès plus facile. Mais la plupart du temps, vous ne vont pas besoin. Seulement, ne vous une faveur et laissez les attributs de l'ouvrir, ce qui rend le débogage est beaucoup plus facile.
Si vous voulez protéger votre objet de manipulation par des tiers, vous pouvez jouer avec
__getattr__
et__setattr__
, mais aussi, probablement, vous ne devez pas passer pour un non approuvés objets client avec des données protégées, utilisez le façade modèle au lieu et cacher vos objets de valeur en plus de manière opaque. Vous voudrez peut-être repenser votre architecture, trop.si votre classe est une partie d'une interface publique, et les clients peuvent trafiquer avec des attributs, par tous les moyens de la garde par les accesseurs! Le nombre de classes est plutôt limitée dans une application typique, cependant. Aussi, en utilisant des données immuables a de nombreux avantages; j'utilise souvent des sous-classes de
namedtuple
pour représenter les données dans un gilet pare-balles.En tant que programmeur, si j'ai choisi de tirer hors de mon propre jambe avec un fusil de chasse, ainsi soit-il. Vous êtes à la limitation de ma capacité à corriger / modifier le code en cachant des choses. Le "protégé" et "privé", les mots clés sont juste des anti-modèles. Veuillez abandonner l'idée que vous vous faites personne une faveur en 'cacher' les choses à partir d'autres programmeurs. Si vous voulez faire quelque chose comme cela, utilisez
_variable
et de fournir unvariable
getter de la propriété et pas de setter. Je peux encore modifier manuellement la_variable
cette façon, si je le souhaite. Mais ne pas utiliser la langue de hacks pour dissimuler votre fonctionnement interne d'autres programmeurs.OriginalL'auteur 9000