自定义删除器方法示例
Example of a custom deleter method
我遇到过自定义 getter
或 setter
的各种示例,但是使用自定义 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
我遇到过自定义 getter
或 setter
的各种示例,但是使用自定义 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