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

Запись через дескриптор в ООП в 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 при записи проверяйте, что число не отрицательное.

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