Пример пользовательского метода удаления

Я сталкивался с различными примерами пользовательских getter или setter, но каков будет случай использования пользовательского deleter? Пока что пример, который у меня есть, выглядит примерно так:

def __delattr__(self, attr):
    print('Deleting attr %s' % attr)
    super().__delattr__(attr)
+1
источник поделиться
1 ответ

Это стандартная ловушка модели данных для настройки действий оператора del obj.attr вместо (или в дополнение к) удаления атрибута из экземпляра __dict__. Таким образом, пользовательский код может свободно реализовывать то, что он хочет!

Например, вы можете использовать его как функцию "мягкого удаления", например, скрыть атрибут от публичного доступа без фактического удаления данных за ним. Лично я использовал его для аннулирования кэшей, когда соответствующий метод атрибута get имеет перед ним слой кэширования.

Для примера stdlib рассмотрим класс Mock. По умолчанию экземпляры макетов будут генерировать дочерние макеты для любого доступа к атрибуту. Общедоступный API для "отказа" от дочернего макета, автоматически генерируемого для определенного имени, реализован с помощью пользовательского __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
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос