Y a-t-il un moyen dans Python de remplacer une méthode de classe au niveau de l'instance ? Par exemple :
class Dog:
def bark(self):
print "WOOF"
boby = Dog()
boby.bark() # WOOF
# METHOD OVERRIDE
boby.bark() # WoOoOoF!!
Y a-t-il un moyen dans Python de remplacer une méthode de classe au niveau de l'instance ? Par exemple :
class Dog:
def bark(self):
print "WOOF"
boby = Dog()
boby.bark() # WOOF
# METHOD OVERRIDE
boby.bark() # WoOoOoF!!
Vous devez utiliser MethodType à partir du module types
. Le but de MethodType
est d'écraser les méthodes de niveau d'instance (afin que self
puisse être disponible dans les méthodes écrasées).
Voir l'exemple ci-dessous.
import types
class Dog:
def bark(self):
print "WOOF"
boby = Dog()
boby.bark() # WOOF
def _bark(self):
print "WoOoOoF!!"
boby.bark = types.MethodType(_bark, boby)
boby.bark() # WoOoOoF!!
class Dog:
def bark(self):
print "WOOF"
boby = Dog()
boby.bark() # WOOF
# METHOD OVERRIDE
def new_bark():
print "WoOoOoF!!"
boby.bark = new_bark
boby.bark() # WoOoOoF!!
Vous pouvez utiliser la variable boby
l'intérieur de la fonction si vous en avez besoin. Puisque vous remplacez la méthode juste pour cet objet d'instance, cette façon est plus simple et a exactement le même effet que l'utilisation de self
.
Veuillez ne pas le faire comme indiqué. Le code devient illisible lorsque vous corrigez une instance pour qu'elle soit différente de la classe.
Vous ne pouvez pas déboguer le code monkeypatched.
Lorsque vous trouvez un bogue dans boby
et print type(boby)
, vous verrez que (a) c'est un Chien, mais (b) pour une raison obscure, il n'aboie pas correctement. C'est un cauchemar. Ne fais pas ça.
Veuillez le faire à la place.
class Dog:
def bark(self):
print "WOOF"
class BobyDog( Dog ):
def bark( self ):
print "WoOoOoF!!"
otherDog= Dog()
otherDog.bark() # WOOF
boby = BobyDog()
boby.bark() # WoOoOoF!!
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.