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

为何含__delete__方法的非数据描述符会拦截属性写入?

Python数据描述符的定义与仅实现__delete__的描述符的特殊行为

在Python中,数据描述符的标准定义是实现了描述符协议里的__get__和__set__方法的对象。这个定义出自《Descriptor HowTo Guide》,而且Python内置的inspect.isdatadescriptor函数也是依据这个规则来判断一个对象是不是数据描述符的。

不过这里有个容易让人困惑的点:像下面这个只实现了__delete__方法的DescrDelete类,它并不属于数据描述符(因为没同时实现__get__和__set__),但实际表现却和数据描述符一样,会拦截属性的写入操作。

看这个示例代码:

>>> class DescrDelete:
...     def __delete__(self, instance):
...         pass
>>> class A:
...     attr = DescrDelete()

如果你尝试给A类实例的attr属性赋值,会发现这个值并不会被存在实例的__dict__里——也就是说,这个仅实现了__delete__的描述符,意外地拥有了拦截属性写入的能力,这和我们对非数据描述符的常规认知不太一致。

内容的提问来源于stack exchange,提问作者Sergei Lebedev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:09:54