2017-02-22 1 views
0

Un ingénieur très expérimenté m'a dit de ne JAMAIS utiliser de double soulignement pour définir des méthodes et des variables dans une classe, car elles sont réservées aux méthodes magiques et n'utilisent qu'un seul trait de soulignement. Je comprends que les caractères de soulignement doubles rendent les attributs privés à la classe, et un soulignement unique les protège. Je comprends également que les attributs protégés sont juste une compréhension mutuelle entre les développeurs. J'ai du mal à croire à ne pas utiliser d'attributs privés, alors pourquoi ce concept a-t-il été créé en premier lieu. Donc mes questions sont:Meilleures pratiques de portée d'attribut Python

  • Est-ce vraiment une mauvaise habitude d'utiliser des doubles caractères de soulignement, même quand il est logique de rendre les attributs non publics?
  • Puisque les attributs protégés ne sont "pas vraiment protégés", ne serait-il pas logique de le rendre privé, parce qu'il aurait moins d'erreurs quand il est fait de cette façon?
+3

Cela dépend entièrement de savoir si vous parlez grands doubles underscores (par exemple '__foo') ou avant et arrière (par exemple' __foo__'). – miradulo

+0

@Mitch Diriger simplement le double trait de soulignement, Pas de début et de fin – teddybear123

+0

Dans ce cas, l'affirmation que cela va entrer en conflit avec les méthodes magiques est fausse. Les méthodes magiques utilisent des traits de soulignement avant et arrière et ne peuvent donc pas entrer en conflit. Cependant, voici une raison différente de ne pas les utiliser http: // stackoverflow.com/questions/6930144/souligner-vs-double-souligner-avec-variables-et-méthodes –

Répondre

1

Voici quelques corrections à vos déclarations qui clarifieront, espérons-ce que vous demandez au sujet:

méthodes et attributs magiques sont préfixés et suffixé par un double trait de soulignement. Un double trait de soulignement seulement dans le préfixe est spécifiquement pour rendre les choses privées.

Dans Python 3 et versions ultérieures, les attributs précédés uniquement d'un double trait de soulignement sont tronqués de leur nom pour les rendre plus confidentiels. Vous ne pourrez pas y accéder en dehors d'un cours en utilisant le nom littéral. Cela peut entraîner des problèmes en dehors des classes, n'utilisez donc pas de préfixe de double soulignement pour les attributs de niveau module: How to access private variable of Python module from class. Cependant, utilisez-les dans les classes pour rendre les choses privées. Si la fonctionnalité n'était pas destinée à être utilisée, elle n'aurait pas été ajoutée à Python.

En ce qui concerne la confidentialité et la protection en général, il n'existe pas de concept de ce type en Python. C'est juste une attente que les programmeurs orientés objet viennent d'autres langues, donc il y a une convention établie pour marquer les attributs comme privés. Le préfixe unique de soulignement est généralement le moyen préféré pour marquer les choses comme privé, car il ne réduit pas le nom, laissant la vie privée à la discrétion de l'utilisateur de l'API. Ce type de confidentialité/protection est en réalité davantage un moyen d'indiquer que l'attribut est un détail d'implémentation susceptible de changer dans les futures versions. Il n'y a rien qui vous empêche d'utiliser l'attribut, surtout si vous êtes OK lorsque votre code est rompu lorsqu'il est lié à différentes versions de bibliothèques. Gardez à l'esprit que même les noms mutilés suivent un modèle fixe pour une version donnée de Python. Le mangling vise plus à vous empêcher de surcharger accidentellement quelque chose que vous n'aviez pas l'intention de faire que de rendre les attributs vraiment privés. Il ajoute simplement le nom de classe avec un tas de traits de soulignement à votre nom d'attribut, de sorte que vous pouvez toujours y accéder directement si vous savez comment.

Voici une bonne description de tout à peu près, je viens d'écrire des docs: https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

+0

Cela répond à ma question merci beaucoup! – teddybear123

+0

En outre, lisez ce post: http://stackoverflow.com/questions/7456807/python-name-mangling –

+0

@ teddybear123. Veuillez sélectionner cette réponse si elle vous aide en cliquant sur la coche sous les boutons de vote. –