Утром Узор выводит на стену машинного зала то, что нашёл ночью в классе насоса. Кода немного, и на первый взгляд в нём нет ничего страшного: ни __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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.