Python中的数据描述符是一个实现描述符协议的__get__
和__set__
方法的对象。该定义在"Descriptor HowTo Guide"中给出,并在inspect.isdatadescriptor
函数中实现。
因此,DescrDelete
是非数据描述符。但是,它似乎劫持了属性写入,好像它是一个数据描述符:
>>> class DescrDelete:
... def __delete__(self, instance): pass
...
>>> class A:
... attr = DescrDelete()
...
>>> instance = A()
>>> instance.attr = 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __set__
为了进行比较,DescrSet
(也是非数据描述符)不会出现此行为:
>>> class DescrGet:
... def __get__(self, instance, value): pass
...
>>>
>>> class A:
... attr = DescrGet()
...
>>> instance = A()
>>> instance.attr = 42