129 votes

"Privé" (mise en œuvre) de la classe en Python

Je suis le codage d'un petit module Python composé de deux parties:

  • certaines fonctions de la définition d'une interface publique,
  • une classe d'implémentation utilisée par les fonctions ci-dessus, mais qui n'est pas significatif à l'extérieur du module.

Au premier abord, j'ai décidé de "cacher" cette mise en œuvre de la classe en le définissant à l'intérieur de la fonction à l'aide, mais cela nuit à la lisibilité et ne peut pas être utilisé si plusieurs fonctions de réutilisation de la même classe.

Donc, en plus des commentaires et des docstrings, est-il un mécanisme pour marquer une classe comme "privé" ou "interne"? Je suis conscient du fait que le trait de soulignement mécanisme, mais je comprends qu'il ne s'applique qu'à des variables, des fonctions et de méthodes de nom.

206voto

Ferdinand Beyer Points 27723

L'utilisation d'un seul trait de soulignement préfixe:

class _Internal:
    ...

C'est l'officiel de Python convention de l '"intérieur" symboles; "from module import *" ne pas importer le trait de soulignement précédé d'objets.

78voto

Karl Fast Points 2812

En bref:

  1. Vous ne pouvez pas appliquer de confidentialité. Il n'y a pas privé les classes/méthodes/fonctions en Python. Au moins, pas la plus stricte intimité, comme dans d'autres langages tels que Java.

  2. Vous ne pouvez indiquer/suggérons de confidentialité. Cela fait suite à une convention. Le python de la convention pour le marquage d'une classe/fonction/méthode est de les faire précéder d'un _ (underscore). Par exemple, def _myfunc() ou class _MyClass:. Vous pouvez également créer des pseudo-intimité en faisant précéder la méthode avec deux caractères de soulignement (par exemple: __foo). Vous ne pouvez pas accéder à la méthode directement, mais vous pouvez toujours l'appeler par le biais d'un préfixe à l'aide de la classe (par exemple: _classname__foo). Donc le mieux que vous pouvez faire est d'indiquer/suggérons de confidentialité, de ne pas l'appliquer.

Python est comme perl à cet égard. Pour paraphraser une phrase célèbre sur la vie privée de l'Perl livre, la philosophie est que vous devez rester de la salle de séjour parce que vous n'étiez pas invités, non pas parce qu'il est défendu avec un fusil de chasse.

Pour plus d'informations:

43voto

UncleZeiv Points 9033

Définir __all__, une liste de noms que vous souhaitez exporter (voir la documentation).

__all__ = ['public_class'] # don't add here the 'implementation_class'

16voto

theller Points 1663

Un modèle que j'ai parfois l'utilisation est ceci:

Définir une classe:

class x(object):
    def doThis(self):
        ...
    def doThat(self):
        ...

Créer une instance de la classe, en écrasant le nom de la classe:

x = x()

Définir des symboles qui exposer les fonctionnalités:

doThis = x.doThis
doThat = x.doThat

Supprimer l'instance elle-même:

del x

Maintenant, vous avez un module qui expose vos fonctions publiques.

11voto

Benjamin Peterson Points 5277

La convention est à mettre "_" à l'intérieur des classes, des fonctions et des variables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X