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

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逻辑的v property对象。
  • 之后@v.setter装饰同名的v方法,给这个v property添加了setter逻辑,此时v是一个可读可写的完整property。
  • 关键步骤:@v.deleter装饰了名为value的方法。Python中,property对象的deleter方法会返回一个新的property对象——这个新对象继承了原v property的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:27