Какие методы можно реализовать в Python классах и как они работают
Что проверяют
Знаете ли вы виды методов и понимаете ли, что специальные методы подключают объект к синтаксису языка.
Как отвечать
Три вида обычных методов:
- метод экземпляра: первым параметром получает сам объект. Обычный случай;
- метод класса с декоратором класса: получает класс. Основное применение это альтернативные конструкторы, например создание объекта из строки или словаря. Корректно работает с наследованием, потому что получает фактический класс;
- статический метод: не получает ни объекта, ни класса. По сути функция, логически принадлежащая классу;
- свойство: превращает вычисление в атрибут, позволяя добавить логику чтения и записи без изменения внешнего интерфейса.
Дальше специальные методы, они же двойные подчёркивания. Их смысл в том, что они подключают объект к синтаксису языка:
- создание и представление: инициализация, выделение объекта, представление для отладки и для человека;
- сравнение и хеш: равенство, порядок (полный набор операторов достигается декоратором из стандартной библиотеки), хеш. Правило: определили равенство, определяйте и хеш, иначе объект перестанет быть хешируемым;
- контейнер: длина, доступ по ключу, присваивание по ключу, проверка вхождения, перебор;
- итератор: получение итератора и следующего элемента;
- вызываемость: объект начинает работать как функция;
- контекстный менеджер: вход и выход, за счёт чего объект работает с конструкцией управления ресурсом;
- доступ к атрибутам: перехват обращения к отсутствующему атрибуту и к любому атрибуту, а также присваивания. Мощно и опасно, легко получить бесконечную рекурсию;
- арифметика: сложение, умножение и остальные операторы.
Отдельно стоит упомянуть дескрипторы: объекты, определяющие поведение при чтении и записи атрибута. Именно на них построены свойства и обычные методы.
И __slots__: фиксирует набор атрибутов, экономя память на большом числе экземпляров ценой отказа от динамического добавления полей.
Где спотыкаются
Определяют равенство и забывают хеш.
Путают представление для отладки и для человека.
Перехватывают доступ к атрибутам и получают бесконечную рекурсию.
Используют статический метод там, где нужен метод класса, и ломают наследование.