Раздел 45 · Python backend: Тарбадель

Дескрипторы

middle~45 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Утром Узор выводит на стену машинного зала то, что нашёл ночью в классе насоса. Кода немного, и на первый взгляд в нём нет ничего страшного: ни __getattr__, ни __getattribute__, которые ты вчера научился подозревать.

class Steady:
    def __get__(self, instance, owner=None):
        return 4

    def __set__(self, instance, value):
        vars(instance)["pressure"] = value


class Pump:
    pressure = Steady()


pump = Pump()
pump.pressure = 9
print(vars(pump))
print(pump.pressure)
{'pressure': 9}
4

В прошлом уроке ты прошёл поиск атрибута и оставил в нём дыру: «особые атрибуты класса, которые главнее словаря объекта». Призрак вставил в класс насоса такой. Steady это не число и не функция, а объект с методами __get__ и __set__, и Python отдаёт ему решение, что вернуть на pump.pressure.

Такие объекты называются дескрипторами. Ты пользуешься ими с первого класса, не зная имени: каждый метод, каждое property, каждый classmethod это дескриптор. Сегодня ты назовёшь их, научишься писать свои и узнаешь, как метод получает свой self. А на этапе арсенал получит поле с договором, которое Лорра давно просила.

урок из курса

Урок из курса «Python backend: Тарбадель». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.