Python 2.7如何通过property设置私有属性及关联内部属性?
问题分析与解决方案
嘿,这个问题我太熟悉了!咱们先搞清楚为啥会报错,然后看看怎么解决~
错误原因
你遇到的问题根本不是“不能用property同时设置多个属性”,而是Python 2.7的旧式类不支持@property的setter装饰器!
在Python 2.7中,如果你的类没有显式继承object,它会被当作旧式类(old-style class)。旧式类对@property的支持很有限,你定义的@x.setter装饰器根本不会生效!
这就导致:
- 当你在
__init__里执行self.x = x时,并没有调用你写的setter方法,而是直接给实例创建了一个普通属性x,完全绕过了property的逻辑 - 既然setter没被触发,里面的
self._y = self.x**2自然也不会执行,所以实例化后访问_y就会报属性不存在的错误
修复方案
只需要把你的类改成新式类,也就是让它继承object就行:
class A(object): # 这里加上(object),转为新式类 def __init__(self, x): self.x = x @property def x(self): return self.__x @x.setter def x(self, x): self.__x = x self._y = self.x**2
现在再测试:
>>> mytest = A(2) >>> mytest._y 4 >>> mytest.x = 3 >>> mytest._y 9
完美!每次设置x的时候,setter都会自动更新_y。
额外说明
- 在Python 3中,所有类默认都是新式类,不需要显式继承
object,所以这个问题在Python 3里不会出现 - 用property同时更新多个关联属性是完全可行的,只要确保你的类是新式类,setter逻辑正确就行
内容的提问来源于stack exchange,提问作者math
相关产品推荐
相关产品推荐

