You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复__str__方法引发的无限递归循环问题?

解决RecursionError: maximum recursion depth exceeded问题

问题根源

你遇到的递归错误核心原因是在AreaOfEffect类的构造方法里,调用父类Trait的__init__时错误地传递了self参数,这直接导致了无限递归的连锁反应:

  1. 当AreaOfEffect实例化时,super().__init__(self, "Area of Effect")把当前实例self作为第一个参数传给了Trait的__init__,而Trait的__init__第一个参数是name,所以self.name实际上存储的是AreaOfEffect对象本身。
  2. 当调用__str__方法时,ret_str += f'{self.name}\n'会尝试将self.name(也就是当前AreaOfEffect实例)转换成字符串,这会自动触发该实例的__str__方法。
  3. 于是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:58