web-dev-qa-db-fra.com

Comment puis-je m'empêcher de réfroser les variables des membres avec des «nouveaux»?

La majeure partie de mon expérience de programmation a été avec C++ et (Shudder) Fortran (je suis un scientifique et non un programmeur en tant que tel, mais je fais de mon mieux). J'ai récemment commencé à utiliser python de manière approfondie et à le trouver génial. Cependant, je viens de passer des heures frustrantes à suivre un bug qui s'est avéré être causé par moi créer un nouveau membre d'objet dans une fonction, c'est-à-dire.

def some_func(self):
    self.some_info = list()

mais, j'avais déjà créé ailleurs le membre some_info Pour cet objet pour un but différent, de sorte que de mauvaises choses se produisent évidemment plus tard, mais c'était difficile de retrouver ici ici.

Maintenant, évidemment dans une langue comme C++, cela est impossible à faire, car vous ne pouvez pas simplement créer des membres d'objets à la volée. Parce que je suis habitué à la langue en prenant soin de cela, je n'ai pas une discipline procédurale bien développée pour m'empêcher d'abuser de la liberté que python (et d'autres langues dactylographiées) fournit.

Alors, quelle est la meilleure façon d'empêcher ce type d'erreur lorsque vous utilisez des langues comme Python?

5
Bogdanovist

Cela peut être un conseil quelque peu trivial, mais essayez de ne pas créer d'attributs en dehors de __init__ Méthode (surtout pas en dehors des méthodes de la classe), à ​​moins que vous n'ayez vraiment besoin. pylint attrape ceci, parmi beaucoup d'autres choses.

Bien sûr, il est toujours possible de réaffecter un attribut existant à autre chose, mais au moins vous aurez un endroit unique où vous pouvez voir tous les attributs à la fois. Cela garantira également que juste après la construction de votre objet valide et ne nécessite pas d'appels à d'autres méthodes d'évolution de l'état interne.

10
fjarri

En bref, vous faites de vos cours plus petits, suffisamment petit que de tels conflits sont faciles à repérer. Habituellement, lorsque vous ne pouvez pas trouver un moyen de créer un membre dans __init__ C'est un bon signe que vous voudrez peut-être le diviser en sa propre classe. Évitez également d'utiliser un membre lorsqu'une variable locale fera.

Lorsqu'un langage de programmation n'impose pas des pratiques, vous devez les imposer vous-même.

5
Karl Bielefeldt

J'avais déjà créé ailleurs le membre one_info pour cet objet pour un but différent

Eh bien, vous n'avez pas publié de véritables noms de votre classe et de votre membre, mais de telles choses peuvent se produire plus facilement lorsque some_info A un nom ambigé, ne précisant que c'est un but réel. Donc, outre les autres bonnes réponses ici, essayez d'éviter cela, choisissez des noms qui documentent le but d'une variable plus clairement, en particulier pour les variables de membre.

4
Doc Brown