2010-05-13 3 views
2

En C++ variables d'instance sont privées par défaut, dans les variables Python sont publiques par défautEt si je garde les membres de mes cours publics?

j'ai deux questions concernant la même: -

1: pourquoi Python ont tous les membres sont publiques par défaut?

2: Les gens disent que les données de vos membres devraient être privées Et si je rendais mes données publiques? Quels sont les inconvénients de cette approche? pourquoi c'est un mauvais design?

Répondre

13

Vous pouvez utiliser un trait de soulignement principal dans le nom pour indiquer aux lecteurs du code que le nom en question est un détail interne et qu'ils ne doivent pas compter dessus dans les futures versions. Une telle convention est vraiment tout ce dont vous avez besoin - pourquoi peser la langue avec un mécanisme d'application? Les données, tout comme les méthodes, doivent être publiques (nommées sans un soulignement principal) si elles font partie de l'API conçue de votre classe et que vous avez l'intention de les prendre en charge à l'avenir. En C++ ou en Java, cela est peu probable parce que si vous voulez changer le membre de données en méthode accesseur, vous n'avez pas de chance - vous devrez casser votre API et chaque client de la classe devra changement. En Python, et d'autres langages supportant une construction semblable à property, ce n'est pas le cas - vous pouvez toujours remplacer un membre de données par une propriété qui appelle les méthodes d'accesseur de façon transparente, l'API ne change pas, ni le code client. Donc, en Python et dans d'autres langages avec des constructions similaires à property (je crois que les langages .NET sont comme ça, au niveau du code source mais pas forcément au niveau du bytecode), vous pouvez aussi laisser vos données publiques quand elles font partie de l'API aucun accesseur n'est actuellement nécessaire (vous pouvez toujours ajouter des méthodes d'accesseur à des versions d'implémentation ultérieures si nécessaire, et ne pas casser l'API).

Donc, ce n'est pas vraiment un problème général d'OO, c'est spécifique à la langue: un langage donné supporte-t-il une construction semblable à une propriété. Python fait.

+0

+1 .. aime la réponse ... spécialement où vous avez dit "pourquoi peser la langue avec un mécanisme d'exécution?" – Perpetualcoder

+0

Le commentaire sur les langages .NET est faux. Le passage d'un champ à une propriété est un changement d'API. – porges

+0

@Porges Vous voulez dire au niveau du bytecode, correct? – fredoverflow

3

Je ne peux pas commenter Python, mais en C++, les structures fournissent un accès public par défaut.

La raison principale pour laquelle vous voulez une partie privée de votre classe est que, sans un, il est impossible de garantir que vos invariants sont satisfaits. Si vous avez une classe de chaînes, par exemple, qui est censée garder une trace de la longueur de la chaîne, vous devez être capable de suivre les insertions. Mais si le membre char* sous-jacent est public, vous ne pouvez pas le faire. Tout le monde peut juste venir et virer quelque chose sur la fin, ou écraser votre terminateur nul, ou appeler le delete[] dessus, ou quoi que ce soit. Lorsque vous appelez votre membre length(), vous devez simplement espérer le meilleur.

1

C'est vraiment une question de philosophie de conception de langage. Je privilégie le camp Python, ce qui pourrait être un peu lourd sur le style C++, mais en fin de compte, en C++, il est possible d'empêcher les utilisateurs de votre classe d'accéder à certaines parties internes.

En Python, c'est une question de convention et de dire que c'est interne. Certaines applications peuvent souhaiter accéder au membre interne à des fins non malveillantes (par exemple, les générateurs de documentation). Certains utilisateurs qui savent ce qu'ils font pourraient vouloir faire la même chose. Les gens qui veulent se tirer une balle dans le pied en se fiant aux détails internes ne sont pas protégés contre le suicide. Comme l'a dit Dennis, «tout le monde peut venir et coller quelque chose à la fin, ou écraser votre terminateur nul».Python traite l'utilisateur comme un adulte et s'attend à ce qu'elle prenne soin d'elle-même. C++ protège l'utilisateur comme un enfant.

+0

+1 juste pour l'équilibre -1. – gorsky

+1

Je me demande pourquoi le commentateur original a mis un -1. Merci quand même. –

+1

Mais encore, la chose qui sauve la journée en Python, ce sont les propriétés. Sans le support de la langue, il serait autrement beaucoup de travail pour changer le code d'utilisateur, si les choses deviennent critiques/un besoin de faire quelque chose quand un champ est modifié. – UncleBens

Questions connexes