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