Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗pyOpDsDl 58 of 174 menu
◀ ▶

Удаление через дескриптор в ООП в Python

Команда del с именем свойства вызывает у дескриптора метод __delete__. Так же устроен декоратор deleter у property, только здесь логику удаления пишем сами.

Добавим __delete__ к нашему дескриптору с чтением и записью:

class Field: def __init__(self, name): self.name = name def __get__(self, obj, owner): if obj is None: return self return obj.__dict__[self.name] def __set__(self, obj, value): obj.__dict__[self.name] = value def __delete__(self, obj): del obj.__dict__[self.name]

Подключим свойство name к классу User:

class User: name = Field('name')

Запишем имя, удалим его и попробуем прочитать снова:

user = User() user.name = 'john' del user.name print(user.name) # ошибка

После __delete__ ключ исчезает из __dict__. Повторное чтение через __get__ приведет к ошибке, потому что значения больше нет.

Можно удалять не ключ, а сбрасывать значение в None. Тогда чтение останется возможным:

class SoftField: def __init__(self, name): self.name = name def __get__(self, obj, owner): if obj is None: return self return obj.__dict__[self.name] def __set__(self, obj, value): obj.__dict__[self.name] = value def __delete__(self, obj): obj.__dict__[self.name] = None class User: name = SoftField('name')

Проверим мягкое удаление:

user = User() user.name = 'john' del user.name print(user.name) # выведет None

Сделайте класс Employee со свойством зарплаты на дескрипторе. Добавьте удаление через __delete__.

Сделайте для имени Employee мягкое удаление: после del чтение возвращает None.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить