为什么带有__delete__方法劫持属性的非数据描述符会写入?

时间:2018-03-20 22:19:44

标签: python descriptor

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

0 个答案:

没有答案