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

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

Главная задача дескриптора при чтении - метод __get__. Python вызывает его каждый раз, когда слева от имени нет команды записи или del.

Чтобы один класс дескриптора подходил для разных свойств, в нем хранят имя, под которым лежат данные в __dict__ объекта. Давайте сделаем такой дескриптор:

class Reader: def __init__(self, name): self.name = name def __get__(self, obj, owner): if obj is None: return self return obj.__dict__[self.name]

Подключим дескриптор к классу User и зададим начальные значения в конструкторе:

class User: name = Reader('name') surn = Reader('surn') def __init__(self, name, surn): self.__dict__['name'] = name self.__dict__['surn'] = surn

Создадим объект и прочитаем свойства:

user = User('john', 'smit') print(user.name) print(user.surn)

Данные лежат в obj.__dict__ под обычными ключами. Дескриптор лишь перехватывает чтение и сам достает нужное значение по сохраненному имени.

Так же можно вернуть не сырой ключ, а обработанное значение. К примеру, добавим к имени восклицательный знак:

class Shout: def __init__(self, name): self.name = name def __get__(self, obj, owner): if obj is None: return self return obj.__dict__[self.name] + '!' class User: name = Shout('name') def __init__(self, name): self.__dict__['name'] = name

Проверим работу:

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

Сделайте класс Employee с дескриптором чтения для имени сотрудника.

Добавьте в Employee дескриптор чтения для зарплаты.

Сделайте дескриптор, который при чтении зарплаты добавляет к числу знак доллара через str.

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