在瞬间重写方法

2024-06-16 13:52:04 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中是否有方法在实例级重写类方法? 例如:

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

boby = Dog()
boby.bark() # WOOF
# METHOD OVERRIDE
boby.bark() # WoOoOoF!!

Tags: 实例方法selfdefmethodclassprintdog
3条回答

您需要使用来自类型模块的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代码。

当你在bobyprint type(boby)中发现一个bug时,你会发现(a)它是一只狗,但是(b)由于某种不清楚的原因,它没有正确地吠叫。这是一场噩梦。不要这样做。

请改为这样做。

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"

相关问题 更多 >