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

Python类使用@property装饰器出现6个错误,求排查原因

解决你的@property装饰器错误问题

我来帮你一步步排查代码里的问题,这6个错误主要集中在命名冲突、规范和逻辑错误上:

问题1:类名不符合Python规范

Python类名约定使用大驼峰命名法(首字母大写),你的person应该改成Person——这虽然不是语法错误,但不符合PEP8规范,也容易和实例变量混淆。

问题2:属性名与实例变量重名导致无限递归

这是最核心的错误!你用@property装饰了age方法,但在getter里返回self.age,setter里赋值self.age = new_age——这会触发无限递归:

  • 当调用self.age时,会触发age() getter方法,而方法里又返回self.age,再次调用getter,循环往复直到栈溢出。
  • 同理,setter里的self.age = new_age会不断触发setter方法,导致递归死循环。

解决方法是把实例变量改成带下划线的私有变量(比如_age),避免和@property的方法名冲突。

问题3:打印对象错误

你最后写的print(person)是打印类本身,而不是你创建的实例p1,应该改成print(p1)才能输出实例的字符串表示。

问题4:setter未处理非法输入

你的setter只判断了如果是int类型就赋值,但如果传入非int类型(比如字符串"30"),什么都不会做,这会导致属性值不更新或者出现意外。我在修正代码里添加了错误抛出,明确提示非法输入。

修正后的完整代码

class Person:
    def __init__(self, name, age):
        self.name = name
        # 这里调用setter方法,自动校验年龄合法性
        self.age = age

    @property
    def age(self):
        # 返回私有实例变量,避免递归
        return self._age

    @age.setter
    def age(self, new_age):
        if isinstance(new_age, int) and new_age >= 0:
            self._age = new_age
        else:
            # 抛出错误提示非法输入
            raise ValueError("年龄必须是非负整数")

    def __str__(self):
        return f"{self.name} is {self.age}"

p1 = Person('moe', 34)
print(p1)

测试验证

运行修正后的代码,会输出moe is 34。如果尝试传入非法年龄,比如Person('moe', '34'),会抛出ValueError: 年龄必须是非负整数,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:07:38