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

