102 votes

Remplacer une méthode au niveau de l'instance

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!!

179voto

codelogic Points 22722

Oui, c'est possible :

class Dog:
    def bark(self):
        print "Woof"

def new_bark(self):
    print "Woof Woof"

foo = Dog()

funcType = type(Dog.bark)

# "Woof"
foo.bark()

# replace bark with new_bark for this object only
foo.bark = funcType(new_bark, foo, Dog)

foo.bark()
# "Woof Woof"

53voto

Harshal Dhumal Points 931

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!!

27voto

nosklo Points 75862
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.

13voto

S.Lott Points 207588

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.com

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.

Powered by:

X