Question

Un des avantages de Python réside dans la simplicité avec laquelle vous pouvez nommer des variables qui portent le même nom que l'accesseur:

self.__value = 1

def value():
    return self.__value

Existe-t-il un moyen simple de donner accès aux membres privés d’une classe que je souhaite sous-classer? Souvent, je souhaite simplement travailler avec les objets de données bruts dans une classe sans avoir à utiliser tout le temps des accesseurs et des mutateurs.

Je sais que cela semble aller à l’encontre de l’idée générale de privé et de public, mais généralement la classe que j’essaie de sous-classer est l’un des miens et je suis assez heureux d’exposer les membres à un sous-groupe mais pas à un exemple. de cette classe. Existe-t-il un moyen propre d’apporter cette distinction?

Était-ce utile?

La solution

Pas à l'aise, sans casser davantage l'encapsulation. L'attribut double-underscore est modifié par l'ajout de préfixe '_ClassName' pour la classe à laquelle il est accédé. Ainsi, si vous avez une classe 'ContainerThing' avec un attribut '__value', l'attribut est en fait stocké sous la forme '< code> _ContainerThing__value '. Changer le nom de la classe (ou le refactoring où l'attribut est attribué) reviendrait à casser toutes les sous-classes qui tentent d'accéder à cet attribut.

C’est précisément la raison pour laquelle le double soulignement de noms (ce qui n’est pas vraiment "privé", mais "gênant") est une mauvaise idée. Utilisez simplement un simple premier soulignement. Tout le monde saura qu'il ne faut pas toucher à votre attribut "privé" et vous pourrez toujours y accéder dans les sous-classes et autres situations où il est sacrément pratique. Le changement de nom d'attributs à double soulignement n'est utile que pour éviter les conflits de noms d'attributs véritablement spécifiques à une classe particulière, ce qui est extrêmement rare. Il ne fournit aucune "sécurité" supplémentaire, même les attributs de nom malformés sont accessibles de manière triviale.

Pour l'enregistrement, " __ valeur " et " valeur " (et " _value ") ne sont pas le même nom. Les traits de soulignement font partie du nom.

Autres conseils

"Je sais que cela semble aller à l’encontre de l’idée générale de privé et public" Pas vraiment "contre", juste différent de C ++ et Java.

Privé - tel qu’implémenté en C ++ et en Java n’est pas un concept très utile. Parfois, il est utile d’isoler les détails de la mise en oeuvre. Mais il est beaucoup trop utilisé.

Les noms Python commençant par deux __ sont spéciaux et vous ne devez pas, en temps normal, définir des attributs avec des noms comme celui-ci. Les noms avec __ sont spéciaux et font partie de la mise en oeuvre. Et exposé pour votre usage.

Les noms commençant par un _ sont "privés". Parfois, ils sont cachés, un peu. La plupart du temps, les "adultes consentants" règle s'applique - ne les utilisez pas bêtement, ils sont sujets à changement sans préavis.

Nous avons mis "privé". entre guillemets car il ne s'agit que d'un accord entre vous et vos utilisateurs. Vous avez marqué des éléments avec _ . Vos utilisateurs (et vous-même) doivent en tenir compte.

Nous avons souvent des noms de fonction avec un _ en tête indiquant qu'ils sont considérés comme "privés". et sujet à changement sans préavis.

Les interminables getters et setters requis par Java ne sont pas aussi souvent utilisés en Python. L’introspection Python est plus flexible, vous avez accès au dictionnaire interne des valeurs d’attributs d’un objet et vous avez la première classe fonctionne comme getattr () et setattr () .

De plus, vous disposez de la fonction property () qui est souvent utilisée pour lier les getters et les setters à un seul nom qui se comporte comme un attribut simple, mais qui est en réalité un appel de fonction bien défini. / p>

Vous ne savez pas exactement où le citer, mais la déclaration suivante en ce qui concerne la protection d'accès est canon Pythonic: "Nous consentons tous à des adultes ici".

Tout comme l’a déclaré Thomas Wouters, un seul trait de soulignement important est la manière idiomatique de marquer un attribut comme faisant partie de l’état interne de l’objet. Deux traits de soulignement fournissent simplement une modification de nom pour empêcher un accès facile à l'attribut.

Après cela, attendez-vous simplement à ce que le client de votre bibliothèque n'aille pas se tirer une balle dans le pied en se mêlant au paramètre "privé". attributs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top