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

Python @property装饰器遇最大递归错误,整数属性age报错求助

解决@property处理整数属性时的最大递归错误

嗨,我之前也踩过这个@property的递归坑!咱们来拆解一下问题出在哪~

首先,你遇到的Maximum recursion error(最大递归错误),核心原因是:你在定义age的@property(以及对应的setter)时,使用了和属性名完全相同的实例变量来存储值,导致了无限循环调用。

举个例子,假设你原本的age属性代码是这样的:

@property
def age(self):
    return self.age

@age.setter
def age(self, value):
    self.age = value

当你访问self.age时,会触发@property的getter方法,而getter里又返回self.age,这会再次调用getter,无限循环下去;同理,赋值self.age = value时,会触发setter,setter里又赋值self.age,同样陷入无限递归。

而你的e_mail属性看起来没问题,是因为你没有给它定义setter,而且每次调用时是直接拼接字符串返回(不过其实这里也可以优化,不用把结果存到self.email里,直接返回拼接结果更简洁)。

修正方案:用“私有”实例变量存储实际值

我们可以用一个下划线开头的变量(比如_age)来存储age的实际值,这样就不会和@property的属性名冲突,避免递归:

class person(object):
    def __init__(self, first, last, age=0):
        self.first = first
        self.last = last
        self._age = age  # 用_age存储实际年龄值,避免和@property的age冲突

    @property
    def e_mail(self):
        # 直接返回拼接结果,不用存到实例变量里,更简洁
        return f"{self.first}.{self.last}@example.com"

    @property
    def age(self):
        # 返回存储的实际值_age
        return self._age

    @age.setter
    def age(self, value):
        # 还可以加一些参数验证,比如确保年龄是非负整数
        if isinstance(value, int) and value >= 0:
            self._age = value
        else:
            raise ValueError("年龄必须是非负整数哦")

额外说明

  • 你之前尝试继承object其实在Python 3里是多余的,因为Python 3中所有类默认都继承自object,但这并不是导致递归错误的原因。
  • 下划线开头的变量(比如_age)是Python里约定俗成的“私有”变量,虽然外部还是能访问,但它提示开发者不要直接修改这个变量,而是通过@property提供的接口来操作。

内容的提问来源于stack exchange,提问作者jsks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:13:23