725 votes

Python ont des "privés" des variables dans les classes?

Je suis en provenance du monde Java et la lecture de Bruce Eckels' Python 3 modes d'expressions idiomatiques.

Lors de la lecture sur les classes...il continue à dire qu'en Python il n'est pas nécessaire de déclarer les variables d'instance. Vous venez de les utiliser dans le constructeur...et boum..ils sont là.

Ainsi, par exemple:

class Simple:
        def __init__(self1, str):
                print("inside the simple constructor")
                self1.s = str
        def show(self1):
                print(self1.s)
        def showMsg (self, msg):
                print (msg + ':', self.show())

Ma question est, si ci-dessus est le cas, alors tout objet de la classe Simple suffit de modifier la valeur de la variable s à l'extérieur de la classe. Par exemple:

if __name__ == "__main__":
        x = Simple("constructor argument")
        x.s = "test15" #this changes the value
        x.show()
        x.showMsg("A message")

En Java, nous avons appris à propos de public/privé/protégé variables. Ces mots-clés, parce que parfois vous voulez des variables dans une classe à laquelle personne n'en dehors de la classe a accès.

Pourquoi n'est-ce pas nécessaire en Python?

1128voto

Kirk Strauser Points 12087

C'est culturel. En Python, tu n'écris pas pour les autres classes d'instance ou de variables de classe. En Java, rien ne vous empêche de faire de même si vous vraiment voulez - après tout, vous pouvez toujours modifier le source de la classe elle-même pour obtenir le même effet. Python que des gouttes prétexte de la sécurité et encourage les programmeurs à être responsable. Dans la pratique, cela fonctionne très bien.

Si vous souhaitez émuler les variables privées pour une raison quelconque, vous pouvez toujours utiliser la fonction "__" le préfixe de la PEP 8. Python mangles les noms de variables comme l' __foo de sorte qu'ils ne sont pas facilement visibles par le code de l'extérieur de la classe qui les contient (bien que vous pouvez obtenir autour d'elle si vous êtes assez déterminé, comme vous pouvez l'obtenir autour de Java protections si vous travaillez à lui).

Par la même convention, " _ " préfixe signifie "rester à l'écart, même si vous n'êtes pas empêché de le faire." Vous n'avez pas jouer avec une autre classe de variables qui ressemblent __foo ou _bar.

27voto

Johnny Points 203

Python n'a pas besoin de protéger quelqu'un d'affecter une valeur à une variable membre, parce que:

A) En Python vous ne pouvez pas accidentellement faire une faute de frappe, telles que la comparaison se transforme en une cession.
B) Python développeurs de ne pas faire d'erreurs.
C) Tous les ci-dessus.
D) Quelle était la question?

12voto

Dan Olson Points 11210

Python a un support limité pour le privé identifiants, grâce à une fonctionnalité qui ajoute automatiquement le nom de la classe à tous les identificateurs commençant par deux caractères de soulignement. C'est transparent pour le programmeur, pour la plupart, mais l'effet net est que les variables nommé de cette façon peuvent être utilisées comme des variables privées.

Voir ici pour en savoir plus.

En général, le Python de la mise en œuvre de l'orientation de l'objet est un peu primitif par rapport à d'autres langues. Mais j'aime cela, en fait. C'est un concept simple de mise en œuvre et s'accorde bien avec le style dynamique de la langue.

6voto

S.Lott Points 207588

"En java, nous avons appris à propos de public/privé/protégé variables"

"Pourquoi n'est-ce pas nécessaire en python?"

Pour la même raison, il n'est pas nécessaire en Java.

Vous êtes libre de les utiliser-ou de ne pas utiliser private et protected.

Comme un Python et Java programmeur, j'ai trouvé qu' private et protected sont très, très important de concepts de design. Mais en pratique, dans des dizaines de milliers de lignes de Java et Python, je n'ai jamais réellement utilisé private ou protected.

Pourquoi pas?

Voici ma question "protégé contre qui?"

D'autres programmeurs dans mon équipe? Ils ont de la source. Ce n'est protégée de dire quand ils peuvent le changer?

D'autres programmeurs sur les autres équipes? Ils travaillent pour la même société. Ils peuvent -- avec un appel téléphonique -- obtenir le code source.

Les Clients? C'est le travail d'un contrat de louage de programmation (en général). Les clients (en général), propre au code.

Alors, qui c'est précisément -- suis-je la protéger?

La droite. Le schizophrène sociopathe qui a refusé de lire les API des blocs de commentaires.

5voto

user711294 Points 81

privé et protégé concepts sont très importants. Mais python - juste un outil de prototypage rapide et de développement avec des ressources limitées disponibles pour le développement, c'est pourquoi certains niveaux de protection ne sont pas aussi stricte suivie en python. Vous pouvez utiliser "__" dans la classe membre, il fonctionne correctement, mais ne semble pas assez bon - chaque accès à ce champ contient ces caractères.

Aussi, vous pouvez remarqué que python programmation orientée objet concept n'est pas parfait, smaltalk ou ruby beaucoup plus proche de pur concept de la programmation orientée objet. Même C# ou Java sont les plus étroits.

Python est un très bon outil. Mais il est simplifié de la programmation orientée objet du langage. Du point de vue syntaxique et conceptuel simplifié. L'objectif principal de python existence est d'apporter aux développeurs la possibilité d'écrire facilement un code lisible avec un haut niveau d'abstraction dans une manière très rapide.

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