如何修复__str__方法引发的无限递归循环问题?
解决RecursionError: maximum recursion depth exceeded问题
问题根源
你遇到的递归错误核心原因是在AreaOfEffect类的构造方法里,调用父类Trait的__init__时错误地传递了self参数,这直接导致了无限递归的连锁反应:
- 当
AreaOfEffect实例化时,super().__init__(self, "Area of Effect")把当前实例self作为第一个参数传给了Trait的__init__,而Trait的__init__第一个参数是name,所以self.name实际上存储的是AreaOfEffect对象本身。 - 当调用
__str__方法时,ret_str += f'{self.name}\n'会尝试将self.name(也就是当前AreaOfEffect实例)转换成字符串,这会自动触发该实例的__str__方法。 - 于是
AreaOfEffect.__str__又调用super().__str__,再次访问self.name,循环往复直到超出Python的递归深度限制。
修正方案
只需要修改AreaOfEffect的__init__方法,去掉传给父类构造方法的多余self参数即可,同时我还修正了long_desc里的字符串格式化错误(原代码没正确引用self.area):
from abc import ABC, abstractmethod from enum import Enum, unique from parlumen.game import * # Base Trait class class Trait(ABC): def __init__(self, name, short_desc="No Desc", long_desc=None): self.name = name self.short_desc = short_desc if long_desc is None: self.long_desc = self.short_desc else: self.long_desc = long_desc @abstractmethod def __str__(self): ret_str = "" ret_str += f'{self.name}\n' ret_str += f'{self.long_desc}' return ret_str # Area of Effect Definition @unique class Focus(Enum): NoFocus = 'None' Origin = 'Origin' Reversed = 'Reversed' class AreaOfEffect(Trait): def __init__(self, area, focus=None): # 修正:去掉多余的self参数,正确调用父类构造 super().__init__("Area of Effect") self.area = area if focus is None : self.focus = Focus.NoFocus else: self.focus = focus # 修正字符串格式化,正确引用self.area self.long_desc = f"Gives an attack or spell an area of effect of {self.area}" def __str__(self): ret_str = super().__str__() ret_str += f"\nArea of Effect: {self.area}, Focus: {self.focus}" return ret_str aoe = AreaOfEffect(3, Focus.Origin) print(aoe)
测试结果
修正后运行代码,会输出预期的结果:
Area of Effect Gives an attack or spell an area of effect of 3 Area of Effect: 3, Focus: Focus.Origin
内容的提问来源于stack exchange,提问作者GrowingCode247
相关产品推荐
相关产品推荐

