J'ai une méthode privée def __pickside (auto): code> dans une classe mère que j'aimerais remplacer dans la classe enfant. Cependant, la classe enfant appelle toujours le
def __ pickside hérité (auto): code>. Comment puis-je remplacer la fonction? Le nom de la fonction de la classe enfant est exactement le même que le nom de la fonction du parent. P>
3 Réponses :
Le problème que vous voyez est que les doubles soulignes mangent le nom de la fonction même dans les appels. Cela empêche le polymorphisme de fonctionner correctement car le nom qu'il est mutilé est basé sur le nom de la classe La méthode est définie et non le nom de la classe de l'objet qui est référencé. Remplacement des doubles souligneurs avec quelque chose d'autre résoudra ceci. P>
Regardons l'exemple le plus facile: Le démontage est comme suit: p> Comme vous pouvez le voir, fonction de mangles Python Noms commençant par deux sous-traitants (et accède à ces noms !!) à un nom qui inclut le nom de la classe - dans ce cas La solution est simple, évitez les méthodes pseudo-privées en supprimant les doubles sous-traitants. Par exemple, utilisez _a__pick code> et
_b__pick code>). Cela signifie que la classe dans laquelle une fonction est définie détermine laquelle des méthodes
__ pick code> est appelée. P>
_pick code> au lieu de
__ choisir code>. P> p>
Utilisation Il n'y a pas de privé en python et s'il y en avait, cela vous empêcherait de le faire de toute façon. (C'est le point de substitution privée dans les langues qui l'ont.) P> li>
La Convention commune pour indiquer qu'un attribut ne fait pas partie de l'interface publique d'une classe IT d'utiliser un em> un seul soulignement em>, comme __ foo code> Noms Mangles le nom de la méthode pour le rendre plus tracas pour y accéder lorsque vous en avez besoin. Je recommanderais de ne jamais les utiliser, ce qui rend les choses comme des tests aller plus en douceur. P> li>
_foo code>. Cela suffit pour que votre code soit clair, séparant vos informations internes de votre API publique. P> LI>
ul>
S'il vous plaît n'utilisez pas tous ces
__ code>. Ils sont déroutants. Il n'y a vraiment pas de "privé" en python. Ils font des choses simples d'avoir l'air déroutant. Veuillez mettre à jour votre question avec le plus petit exemple de code indiquant votre problème.
C'est le code que j'ai des problèmes avec ... quoi de plus voulez-vous? Je sais que les fonctions "privées" et les variables sont encore accessibles en python, mais n'utilisera pas toutes les fonctions publiques rendent les choses plus confuses lors de l'utilisation de la classe?
"C'est le code"? Quel code? Pouvez-vous mettre à jour la question pour fournir un échantillon de code réel qui ne fonctionne pas réellement? Il est très difficile de deviner à quoi ressemble votre code. Il est facile de supposer des choses; Il est facile d'assumer mal. "Que veux-tu de plus?" Code. Regarder et voir quelle erreur vous faites réellement, pas de quelle erreur je suppose que vous faites.
Human .__ Pickside (). Cela ne fonctionne pas dans le fait que cela n'appelle pas l'humain .__ Pickside () Je voulais, c'était appelait le joueur .__ Pickside () à la place.
De plus, en ce qui concerne OO Talk, les classes n'ont pas vraiment de "fonctions". ils ont des "méthodes": p
@WRONGUSERNAME Je pense que S.Lott signifiait dans le premier commentaire consistait à laisser qu'ils sont privés dans l'exemple car il est confus et non pertinent. Dans le code actuel, il est préférable de les garder parce qu'ils disent au programmeur quelque chose, même s'il n'est pas appliqué par l'interprète.