Что важно знать
- __new__ создаёт объект, __init__ его настраивает.
- Равные объекты обязаны иметь равные хеши.
- property — это дескриптор.
__new__ и __init__, __eq__ и __hash__, __getattr__ и __getattribute__, дескрипторы.
Практика. Написать дескриптор с проверкой типа для полей класса и сравнить его с property.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
__new__ — статический метод, создаёт и возвращает экземпляр (вызывается первым). __init__ — инициализирует уже созданный объект и ничего не возвращает. __new__ переопределяют редко: подклассы неизменяемых типов (int, str, tuple), синглтоны и кэши экземпляров…
Полный разборХешируемый объект имеет хеш, неизменный за всё время жизни, и сравнивается через __eq__. Правило: равные объекты обязаны иметь равные хеши. Если класс переопределяет __eq__ без __hash__, Python ставит __hash__ = None — экземпляры становятся нехешируемыми.
Полный разбор__getattribute__ вызывается при каждом обращении к атрибуту — это сам механизм поиска. __getattr__ вызывается только если атрибут не найден обычным путём. Для прокси, ленивых атрибутов и обёрток используют __getattr__ — он безопаснее и дешевле.
Полный разборДескриптор — объект в атрибуте класса, у которого есть __get__ (и, возможно, __set__, __delete__). При обращении obj.attr Python вызывает эти методы вместо простого чтения. На дескрипторах построены property, методы (функции — дескрипторы), staticmethod…
Полный разбор@property превращает метод в атрибут: снаружи obj.area, внутри — вычисление или проверка.
Полный разбор__slots__ = ("x", "y") заменяет у экземпляров словарь __dict__ на фиксированные ячейки: объект занимает в несколько раз меньше памяти, доступ к атрибутам чуть быстрее, а добавить новый атрибут нельзя (AttributeError).
Полный разбор__new__ и __init__, согласование __eq__ и __hash__, __getattr__ и __getattribute__, дескрипторы и __slots__.
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.