Comment remplacer les fonctions d'une classe parente dans python?
J'ai une méthode privée def __pickSide(self):
dans une classe parente, que je voudrais remplacer dans la classe enfant. Cependant, l'enfant de la classe appelle encore les hérité def __pickSide(self):
. Comment puis-je remplacer la fonction? L'enfant de la classe nom de la fonction est exactement le même que le parent du nom de la fonction.
source d'informationauteur wrongusername | 2010-03-20
Vous devez vous connecter pour publier un commentaire.
Regardons le plus simple exemple:
Le démontage est comme suit:
Comme vous pouvez le voir, Python mangles fonction des noms commençant par deux caractères de soulignement (et accède à ces noms!!) pour 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 la__pick
méthodes est appelée.La solution est simple, éviter les pseudo-méthodes privées par la suppression de la double soulignement. Par exemple, l'utilisation
_pick
au lieu de__pick
.Le problème que vous voyez n'est que le double souligne marquer le nom de la fonction, même dans les appels. Cela empêche le polymorphisme de travailler correctement puisque le nom il est mutilé est basé sur le nom de la classe de la méthode est définie, et non pas le nom de la classe de l'objet référencé. Remplacement de la double souligne avec quelque chose d'autre va résoudre ce problème.
À l'aide de
__foo
noms mangles le nom de la méthode pour le rendre plus compliqué d'y accéder quand vous en avez besoin. Je recommanderais jamais les utiliser, ce qui rend les choses comme les tests d'aller plus en douceur.Il n'est pas privé en Python, et si il y avait, il serait de vous empêcher de faire cela de toute façon. (C'est le point de trucs privés dans les langues qui ont.)
La commune de la convention pour indiquer qu'un attribut ne fait pas partie de l'interface publique d'une classe à utiliser une seul trait de soulignementcomme
_foo
. Cela est suffisant pour rendre votre code claire séparation des détails internes de votre API publique.