Python中重写类实例方法遇递归错误,如何正确实现?
解决实例方法重写时的递归错误问题
你遇到的递归错误,是因为重写后的new_size方法里调用self.size()时,实际调用的就是它自己,导致无限循环调用。要解决这个问题,核心是保留原方法的引用,让新方法调用原逻辑而非自身。
以下是两种可行的解决方案:
方案一:提前保存原实例方法的引用(未知类时更通用)
在替换方法前,先把原来的size方法存下来,新方法里直接调用这个保存的引用:
from types import MethodType class Animal(): def size(self): return 3 bear = Animal() # 保存原方法的绑定引用 old_size = bear.size def new_size(self): # 调用原方法而非重写后的方法 return old_size() * 2 bear.size() # 返回3 bear.size = MethodType(new_size, bear) bear.size() # 返回6
方案二:通过类调用原方法(已知类时适用)
如果知道实例所属的类,可以直接通过类调用原方法,绕过实例上重写的方法:
from types import MethodType class Animal(): def size(self): return 3 bear = Animal() def new_size(self): # 调用类的原始方法,传入self参数 return Animal.size(self) * 2 bear.size() # 返回3 bear.size = MethodType(new_size, bear) bear.size() # 返回6
如果实例所属的类未知(符合你描述的场景),方案一更通用,因为它不需要依赖类的信息,直接保留了原方法的绑定状态。
内容的提问来源于stack exchange,提问作者Oren Neumann
相关产品推荐
相关产品推荐

