Удаление через дескриптор в ООП в 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.