自定义删除器方法示例

Example of a custom deleter method

我遇到过自定义 gettersetter 的各种示例,但是使用自定义 deleter 的用例是什么?到目前为止,我有一个例子是这样的:

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

这是一个标准的数据模型挂钩,用于自定义语句 del obj.attr 将执行的操作,而不是(或除此之外)从实例 __dict__ 中删除属性。因此,用户代码可以自由实现他们想要的任何东西!

例如,您可以将其用作 "soft delete" 功能,例如从 public 访问中隐藏属性而不实际删除其背后的数据。我个人用过,当对应的get属性方法前面有缓存层时,就用它来使缓存失效

对于 stdlib 示例,请考虑 Mock class. By default, mock instances will generate child mocks for any attribute access. The public API to "opt-out" of a child mock being auto-generated on a particular name is implemented via a custom __delattr__.

>>> 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