2024-06-16 13:52:04 发布
网友
Python中是否有方法在实例级重写类方法? 例如:
class Dog: def bark(self): print "WOOF" boby = Dog() boby.bark() # WOOF # METHOD OVERRIDE boby.bark() # WoOoOoF!!
您需要使用来自类型模块的MethodType。MethodType的用途是覆盖实例级方法(以便self可以在overwriten方法中使用)。
请参见下面的示例。
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!!
请不要这样做,如图所示。当您将实例与类不同时,代码将变得不可读。
无法调试monkeypatched代码。
当你在boby和print type(boby)中发现一个bug时,你会发现(a)它是一只狗,但是(b)由于某种不清楚的原因,它没有正确地吠叫。这是一场噩梦。不要这样做。
boby
print type(boby)
请改为这样做。
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!!
是的,有可能:
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"
您需要使用来自类型模块的MethodType。MethodType的用途是覆盖实例级方法(以便self可以在overwriten方法中使用)。
请参见下面的示例。
请不要这样做,如图所示。当您将实例与类不同时,代码将变得不可读。
无法调试monkeypatched代码。
当你在
boby
和print type(boby)
中发现一个bug时,你会发现(a)它是一只狗,但是(b)由于某种不清楚的原因,它没有正确地吠叫。这是一场噩梦。不要这样做。请改为这样做。
是的,有可能:
相关问题 更多 >
编程相关推荐