Пример пользовательского метода удаления - PullRequest
1 голос
/ 15 октября 2019

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

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

1 Ответ

1 голос
/ 15 октября 2019

Это стандартная ловушка модели данных для настройки действий оператора 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
...