Python中@property实现的Getter/Setter未生效问题咨询
问题原因及解决方法
问题出在类成员的定义顺序上!你把__init__方法写在了@property和@x.setter的前面,这直接导致了逻辑失效:
当__init__执行self.x = x时,类的x属性还没被定义成带setter的property,此时self.x = x只是给实例直接创建了一个普通的实例属性x,完全没触发你后面写的数值验证逻辑。
而后续访问或赋值p1.x时,Python会优先使用实例本身的x属性,而非你后来定义的类级property。这就是为什么输入1001得到1001、输入-12得到-12——你的验证逻辑根本没被执行。
修复方法
把@property和@x.setter的定义挪到__init__前面即可:
class P: @property def x(self): return self.__x @x.setter def x(self, x): if x < 0: self.__x = 0 elif x > 1000: self.__x = 1000 else: self.__x = x def __init__(self,x): self.x = x
现在再执行你的测试代码:
p1 = P(1001) print(p1.x) # 输出 1000 p1.x = -12 print(p1.x) # 输出 0
就能得到符合预期的结果了。
内容的提问来源于stack exchange,提问作者Shmn
相关产品推荐
相关产品推荐

