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
相关产品推荐
相关产品推荐

