Python @property疑问:未定义value的get/set方法却可读写?
为什么未显式定义
value属性的get/set方法,却能对其进行读写操作? 你的代码
class Alphabet: def __init__(self, value): self._value = value # getting the values @property def v(self): print('Getting value') return self._value # setting the values @v.setter def v(self, value): print('Setting value to ' + value) self._value = value # deleting the values @v.deleter def value(self): print('Deleting value') del self._value # passing the value x = Alphabet('Peter') print(x.value) x.value = 'Diesel'
执行输出
Getting value Peter Setting value to Diesel
原因解析
这是因为你定义deleter的写法,意外创建了一个名为value的property对象,它直接复用了v属性的getter和setter逻辑:
- 首先,
@property装饰v方法,生成了一个包含getter逻辑的vproperty对象。 - 之后
@v.setter装饰同名的v方法,给这个vproperty添加了setter逻辑,此时v是一个可读可写的完整property。 - 关键步骤:
@v.deleter装饰了名为value的方法。Python中,property对象的deleter方法会返回一个新的property对象——这个新对象继承了原vproperty的getter和setter,同时把你写的value方法设为它的deleter。最终这个新property会被绑定到类的value属性上。
所以当你读写x.value时,实际操作的是这个隐式生成的value property,它的读写逻辑完全沿用了v的实现,因此会触发对应的打印输出。
正确写法(如果想给v加deleter)
如果你本意是给v属性添加删除逻辑,应该让装饰的方法名和property同名:
@v.deleter def v(self): print('Deleting value') del self._value
这样就不会意外生成value这个额外的property了。
内容的提问来源于stack exchange,提问作者Venkatarao Dadi
相关产品推荐
相关产品推荐

