12
votes

Comment remplacer les fonctions d'une classe mère dans Python?

J'ai une méthode privée def __pickside (auto): 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): . 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.


6 commentaires

S'il vous plaît n'utilisez pas tous ces __ . 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.


3 Réponses :


5
votes

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.


0 commentaires

35
votes

Regardons l'exemple le plus facile: xxx

Le démontage est comme suit: xxx

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 _a__pick et _b__pick ). Cela signifie que la classe dans laquelle une fonction est définie détermine laquelle des méthodes __ pick est appelée.

La solution est simple, évitez les méthodes pseudo-privées en supprimant les doubles sous-traitants. Par exemple, utilisez _pick au lieu de __ choisir .


0 commentaires

4
votes
  • Utilisation __ foo 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.

  • 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.)

  • La Convention commune pour indiquer qu'un attribut ne fait pas partie de l'interface publique d'une classe IT d'utiliser un un seul soulignement , comme _foo . Cela suffit pour que votre code soit clair, séparant vos informations internes de votre API publique.


0 commentaires