Les méthodes privées en Python
Je voudrais avoir une fonction dans ma classe, que je vais utiliser uniquement à l'intérieur des méthodes de cette classe. Je ne vais pas l'appeler en dehors de la mise en œuvre de ces méthodes. En C++, je voudrais utiliser une méthode déclarée dans la section privée de la classe. Quelle est la meilleure façon de mettre en œuvre une telle fonction en python? Je pense à l'aide de statique décorateur pour ce cas. Puis-je utiliser une fonction sans décorateurs et self
mot
Il n'y a pas de véritable "privé" méthodes en Python. Voir cette question - plus précisément, cette réponse.
Je demande à propos de bon style de le faire
staticmethods et méthodes "privées" sont deux choses différentes ... Pouvez-vous expliquer ce que vous voulez vraiment? voulez-vous une méthode qui est à la fois statique et en privé?
Bon style, est de faire précéder le nom de la méthode avec un trait de soulignement.
Je demande à propos de bon style de le faire
staticmethods et méthodes "privées" sont deux choses différentes ... Pouvez-vous expliquer ce que vous voulez vraiment? voulez-vous une méthode qui est à la fois statique et en privé?
Bon style, est de faire précéder le nom de la méthode avec un trait de soulignement.
OriginalL'auteur freude | 2013-06-19
Vous devez vous connecter pour publier un commentaire.
Python n'a pas la notion de privé de méthodes ou d'attributs, il est tout au sujet de la façon de mettre en œuvre votre classe. Mais vous pouvez utiliser des pseudo-variables privées(name mangling), toute variable précédée par
__
(deux caractères de soulignement) devient une pseudo-variable privée.De la docs:
Donc
__private
maintenant devient réellement_A__private
exemple de la méthode statique:
vous avez le définir comme une méthode statique alors et l'appeler comme :
A._A__private()
Que signifie statique dans ce cas?
L'objectif de
__
est pour éviter des affrontements avec des sous-classes. Il le fait par le nom de déformation, en intégrant le nom de la classe dans la variable. Le fait que cela rend la variable la plus difficile à trouver et d'accès est un effet secondaire.Vous avez besoin d'un décorateur. Python traite le premier argument des méthodes de la classe spécialement, donc, sauf si vous appliquez
@staticmethod
ou similaire décorateur, vous obtiendrez une erreur.OriginalL'auteur Ashwini Chaudhary
Python n'a pas la notion de "privé" de la même façon que beaucoup d'autres langues. Il est construit sur les adultes et consentants principe qui dit que les utilisateurs de votre code permettra de l'utiliser de façon responsable. Par convention, les attributs de départ avec un simple ou double trait de soulignement seront traités dans le cadre de la mise en œuvre interne, mais ils ne sont pas vraiment cachés des utilisateurs. Trait de soulignement Double va provoquer nom d'une déformation du nom de l'attribut.
Aussi, j'avais remarque pour vous que
self
est que par convention, non pas par une quelconque fonction de la langue. Pour les méthodes d'instance, lorsqu'il est appelé en tant que membres d'une instance, ils sont implicitement passé l'instance en tant que premier argument, mais dans la mise en œuvre de la méthode elle-même, cet argument peut techniquement être nommé n'importe quelle chose que vous voulez.self
est juste de la convention pour faciliter la compréhension du code. En conséquence, y comprisself
dans la signature d'une méthode n'a pas de réelle fonctionnelle d'autre effet que de provoquer l'instance implicite argument pour être affecté à la variable suivante nom dans la signature. Bien sûr, cela est différent pour les méthodes de classe, qui reçoivent l'instance de la classe de l'objet lui-même comme un implicite premier argument, et des méthodes statiques, qui ne reçoivent aucune implicite des arguments à tous.OriginalL'auteur Silas Ray
Beaucoup de grandes choses ici avec l'obfuscation utilisant des caractères de soulignement. Personnellement, j'ai grandement bénéficier de la langue de conception de décision à rendre les choses publiques, car elle réduit le temps qu'il faut pour comprendre et utiliser les nouveaux modules.
Toutefois, si vous êtes déterminé à mettre en oeuvre privé des attributs/méthodes, et vous êtes prêt à être unpythonic, vous pouvez faire quelque chose le long des lignes de:
Difficile d'imaginer un cas où vous voulez le faire, mais c'est possible.
OriginalL'auteur circld
Python juste ne fait pas dans le privé. Si vous le souhaitez, vous pouvez suivre la convention et de faire précéder le nom avec un seul trait de soulignement, mais c'est à d'autres codeurs égard que, dans un gentleman† mode
† ou gentlewomanly
OriginalL'auteur John La Rooy
vous ne le faites pas:
La pythonic façon de ne pas documenter ces méthodes/membres à l'aide de docstrings, seulement avec de "vrais" commentaires de code. Et de la convention consiste à ajouter un simple ou un double trait de soulignement ;
Ensuite, vous pouvez utiliser la double souligne en face de vos membres, de sorte que vous ils sont locales faites à la classe (c'est surtout le nom d'une déformation, c'est à dire le vrai nom du membre en dehors de la classe devient :
instance.__classname_membername
). C'est utile pour éviter les conflits lors de l'utilisation de l'héritage, ou de créer un "espace privé" entre les enfants d'une classe.AFAICT, il est possible de "masquer" des variables en utilisant des metaclasses, mais qui ne respecte pas l'ensemble de la philosophie de python, donc je ne rentrerai pas dans les détails à ce sujet
c'est exactement ce que je dis: vous ne pouvez pas faire cela, mais vous utilisez les conventions!
Vous pouvez dissimuler attribut d'accès via les metaclasses, et vous pouvez faire les attributs en lecture seule et de mettre en œuvre le privé/setter/getter modèle avec des décorateurs ou des metaclasses, mais la seule façon de dissimuler quelque chose, au point que quelqu'un vraiment ne peut pas les obtenir à partir de code Python est de le cacher dans une C-extension.
OriginalL'auteur zmo