Запись через дескриптор в ООП в Python
Если у дескриптора есть метод __set__,
запись в свойство попадает в него.
Новое значение не попадет в __dict__
напрямую: сначала вызовется __set__.
Давайте расширим дескриптор чтения методом записи:
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
Подключим два свойства к классу User:
class User:
name = Field('name')
surn = Field('surn')
Создадим объект и запишем значения:
user = User()
user.name = 'john'
user.surn = 'smit'
Прочитаем их через дескриптор:
print(user.name)
print(user.surn)
Перед записью можно выполнять проверки,
как в сеттере property. Добавим
отдельный дескриптор для имени с
проверкой на пустую строку:
class NameField:
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):
if len(value) > 0:
obj.__dict__[self.name] = value
else:
print('name is incorrect')
class User:
name = NameField('name')
Проверим корректную и некорректную запись:
user = User()
user.name = 'john'
user.name = '' # ошибка
Сделайте класс Employee с дескрипторами
чтения и записи для имени и зарплаты.
В дескрипторе возраста Employee
при записи проверяйте, что значение
от 0 до 120.
В дескрипторе зарплаты Employee
при записи проверяйте, что число
не отрицательное.