繁体   English   中英

Python 中 class 实例的覆盖方法

[英]Overriding method of a class instance in Python

我有一个未知 class 的实例bear ,其方法size返回一个数字。 例如:

bear.size()

会做一些计算并返回一个数字,比方说 3。

我想重写这个方法,所以无论它是哪个数字,它都会返回 double,所以bear.size()将返回 6。

当我尝试实现它时,出现递归错误,因为新方法会调用自身。 所以当我运行时:

from types import MethodType

class Animal():
    def size(self):
        return 3
bear = Animal()

def new_size(self):
    return self.size() * 2

bear.size() # returns 3. 
bear.size = MethodType(new_size, bear)
bear.size() # should return 6.

我得到RecursionError: maximum recursion depth exceeded 我应该如何覆盖该方法?

谢谢!

您可以将旧的实现隐藏在实例上,以便您可以在覆盖的版本中调用它。

from types import MethodType


class Animal:
    def size(self):
        return 3


bear = Animal()


def new_size(self):
    return self._old_size() * 2


bear.size()  # returns 3.
bear._old_size = bear.size
bear.size = MethodType(new_size, bear)
print(bear.size())  # should return 6.

或者,使用self调用未绑定的原始方法:

from types import MethodType


class Animal:
    def size(self):
        return 3


bear = Animal()


def new_size(self):
    return Animal.size(self) * 2


bear.size()  # returns 3.
bear.size = MethodType(new_size, bear)
print(bear.size())  # should return 6.

除了@AKX 解决方案,您还可以使用装饰并装饰您的 function:

def double_size(fn):
    def wrapper():
        return fn() * 2
    return wrapper

bear.size()
bear.size = double_size(bear.size)
bear.size()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM