首页 > 解决方案 > 自定义删除器方法示例

问题描述

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

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

标签: pythonpython-datamodel

解决方案


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

例如,您可以将其用作“软删除”功能,例如隐藏属性以防止公共访问,而无需实际删除其背后的数据。就个人而言,当相应的 get 属性方法前面有缓存层时,我使用它来使缓存无效。

对于 stdlib 示例,请考虑Mock该类。默认情况下,模拟实例将为任何属性访问生成子模拟。在特定名称上自动生成的子模拟“选择退出”的公共 API 是通过 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

推荐阅读