Python 自定义deleter方法的示例

Python 自定义deleter方法的示例,python,python-datamodel,Python,Python Datamodel,我遇到过各种自定义getter或setter的示例,但是当使用自定义删除器时,会有什么用例呢?到目前为止,我有一个这样的例子: def __delattr__(self, attr): print('Deleting attr %s' % attr) super().__delattr__(attr) 它是一个标准的数据模型钩子,用于定制语句del obj.attr将执行的操作,而不是(或除了)从实例\uuuuu dict\uuu中删除属性。因此,用户代码可以自由地实现他们想要

我遇到过各种自定义
getter
setter
的示例,但是当使用自定义
删除器时,会有什么用例呢?到目前为止,我有一个这样的例子:

def __delattr__(self, attr):
    print('Deleting attr %s' % attr)
    super().__delattr__(attr)

它是一个标准的数据模型钩子,用于定制语句
del obj.attr
将执行的操作,而不是(或除了)从实例
\uuuuu dict\uuu
中删除属性。因此,用户代码可以自由地实现他们想要的任何东西

例如,您可以将其用作“软删除”功能,例如,在不实际删除属性背后的数据的情况下,对公共访问隐藏属性。就我个人而言,当相应的get attribute方法前面有一个缓存层时,我使用它使缓存失效

对于一个STDLIB示例,考虑类。默认情况下,模拟实例将为任何属性访问生成子模拟。用于“选择退出”在特定名称上自动生成的子模拟的公共API为

来自unittest.mock导入mock的
>>
>>>mock=mock()
>>>del mock.attr2#阻止mock.attr2工作
>>>mock.attr1
>>>mock.attr2
AttributeError:attr2

无法明确说明这一点,因此我没有给出答案,但可能您的对象具有设置为其他对象的属性,您可能需要对这些对象进行一些清理,以删除对变量的引用。(例如,在删除对I/O流或连接的引用之前和平地终止某种类型的I/O流或连接。)不过,我只是猜测,因为我从未见过类重写
\uu delattr\uu(…)
方法。
>>> from unittest.mock import Mock  
>>> mock = Mock()   
>>> del mock.attr2  # prevent mock.attr2 from working
>>> mock.attr1  
<Mock name='mock.attr1' id='4414043216'>
>>> mock.attr2
AttributeError: attr2