Сообщить об ошибке.

Другие специальные методы класса в Python.

Настройка проверок экземпляра и подкласса

Следующие специальные методы используются для переопределения поведения по умолчанию встроенных функций isinstance() и issubclass().

В частности, метакласс abc.ABCMeta реализует эти методы, чтобы разрешить добавление абстрактных базовых классов (ABC) в качестве "виртуальных базовых классов" к любому классу или типу (включая встроенные типы), включая другие ABC.

class.__instancecheck__(self, instance):

Метод class.__instancecheck__() возвращает True, если экземпляр следует рассматривать как (прямой или косвенный) экземпляр класса. Если определен, то вызывается для реализации isinstance(instance, class).

class.__subclasscheck__(self, subclass):

Метод class.__subclasscheck__() возвращает True, если подкласс следует считать (прямым или косвенным) подклассом класса. Если определен, то вызывается для реализации issubclass(subclass, class).

Обратите внимание, что эти методы ищутся по типу (метаклассу) класса. Они не могут быть определены как методы класса в реальном классе. Это согласуется с поиском специальных методов, которые вызываются в экземплярах, только в этом случае экземпляр сам является классом.

Эмуляция универсальных "generic" типов.

Можно реализовать синтаксис универсального класса, например, List[int], путем определения специального метода:

object.__class_getitem__(cls, key):

Метод класса class.__class_getitem__() возвращает объект, представляющий специализацию универсального класса по аргументам типа cls, найденным в key.

Этот метод ищется в самом объекте класса, и когда он определен в теле класса, то этот метод неявно является методом класса.

Обратите внимание, что этот механизм в основном зарезервирован для использования с нотациями типов, другое использование не рекомендуется.

Эмуляция вызываемых объектов.

object.__call__(self[, args...]):

Метод class.__call__() вызывается, когда экземпляр "вызывается" как функция.

Если этот метод определен, то x(arg1, arg2, ...) примерно транслируется в type(x).__call__(x, arg1, ...).