Si «explicite vaut mieux qu'implicite», pourquoi n'y a-t-il pas de modificateurs d'accès explicites en Python: public, protégé, privé, etc.?
Je sais que l'idée est que le programmeur devrait savoir quoi faire à travers un indice - pas besoin d'utiliser la «force brute». Mais `` l'encapsulation '' ou la `` dissimulation d'informations '' de l'OMI n'est pas seulement pour garder les gens à l'écart, c'est une question d'organisation et de structure: vos couches de développement doivent avoir des étendues et des frontières auto-définies et clairement délimitées, tout comme les systèmes physiques.
Quelqu'un peut-il m'aider s'il vous plaît ici avec une explication solide pour expliquer pourquoi les restrictions d'accès sont implicites plutôt qu'explicites en Python, un langage qui semble autrement proche de la perfection?
Edit: Jusqu'à présent, j'ai vu 3 réponses proposées, et j'ai réalisé qu'il y a 2 parties à ma question:
Pourquoi n'y a-t-il pas de mots clés, par exemple
private def myFunc(): dostuff....
au lieu de l'OMI, les traits de soulignement laids et difficiles à taper. Mais ce n'est pas le point important.
Plus important:
Pourquoi ces modificateurs d'accès sont-ils uniquement des «recommandations» ou des conseils et ne sont-ils pas appliqués? Ce sera difficile de changer plus tard? Il est très simple de remplacer «protégé» par «public» - et si vous avez une chaîne d'héritage compliquée qui rend la tâche difficile, votre conception est médiocre - votre conception doit être affinée plutôt que de s'appuyer sur une fonction de langage qui facilite l'écriture. code mal structuré.
Lorsque les modificateurs d'accès sont appliqués, votre code est automatiquement compartimenté - vous SAVEZ que certains segments sont hors de portée afin que vous n'ayez pas à les traiter sauf si et quand c'est nécessaire. Et, si votre conception n'est pas bonne et que vous vous trouvez constamment à déplacer des choses dans et hors de différents champs, le langage peut vous aider à nettoyer votre acte.
Autant que j'aime Python, je trouve que ce 2e point est une grave lacune. Et je n'ai pas encore vu de bonne réponse à cela.
la source
private def whatever
, c'estclass x: def whatever(self): pass
un raccourci pourclass x: pass; x.whatever = lambda self: pass
, donc en gros, vous auriez besoin d'un modificateur privé pour l'affectationRéponses:
"Explicit vaut mieux qu'implicite" n'est qu'une des maximes de la philosophie de conception de Python. "Simple vaut mieux que complexe" est là aussi. Et, bien que ce ne soit pas dans le Zen de Python, "Nous sommes tous des adultes consentants ici" en est un autre.
Cette deuxième règle est peut-être la plus importante ici. Quand je crée une classe, j'ai une idée de la façon dont elle va être utilisée. Mais je ne peux pas prévoir toutes les utilisations possibles. Il se peut que certaines utilisations futures de mon code nécessitent l'accès aux variables que j'ai considérées comme privées. Pourquoi devrais-je rendre difficile, voire impossible, l'accès à ces informations si un futur programmeur (ou même un futur moi) en a besoin? La meilleure chose à faire est de les marquer d'un avertissement - comme le note Joonas, un seul préfixe de soulignement est la norme - qu'ils sont internes et peuvent changer; mais l'interdiction totale de l'accès semble inutile.
la source
Je soupçonne que la principale raison des modificateurs d'accès manquants est la simplicité
Comme vous le dites, il ne s'agit pas de garder les gens à l'écart, c'est une question d'organisation, donc le principal point de «privé» est qu'il envoie un message aux utilisateurs de votre API «veuillez ne pas écrire de code qui dépend de cela».
Il est trivial de dire «par convention, _x ou __x ne devraient pas être utilisés en dehors de la classe», mais dans le modèle d'objet dynamique de python, il serait même difficile de trouver une notation.
comment noter l'accessibilité?
Je suppose que c'était un compromis. Si vous ne pouvez strictement pas vivre avec, je suggérerais ruby, qui a un niveau d'abstraction et de dynamicité similaire, mais a un modèle d'objet, qui permet la modification de l'accès.
la source
__x__
sont «magiques» (c'est-à-dire des méthodes qui sont appelées pour permettre l'intégration du langage comme la surcharge des opérateurs, l'itérabilité, etc.). La convention est_x
.__init__
était accessoire. L'exemple définit certaines propriétés de l'objet, qui ne sont pas connues au moment de la compilation, donc un modificateur d'accès explicite ne vous aiderait pas.La convention Python consiste à utiliser un préfixe de soulignement pour les membres protégés / privés.
Cette convention, lorsqu'elle est suivie, est en fait la même chose que les modificateurs d'accès, sauf 1) vous verrez directement à partir du nom du membre, qu'il soit public ou non, et 2) vous pouvez rompre "l'encapsulation" si vous le voulez vraiment (cela peut être justifié par exemple dans testing; dans certaines autres langues, vous devrez utiliser la réflexion == plus de code).
En fin de compte, c'est une question de goût, mais si vous pouvez faire la même chose (avec un peu plus de flexibilité) sans mots-clés spéciaux, la langue sera plus petite et le code sera plus concis, ce qui est généralement une bonne chose.
la source