为何含__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
相关产品推荐
相关产品推荐

