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

Специальный метод __init_subclass__ класса Python

Настройка создания класса в Python

Когда класс наследуется от другого класса, то для этого класса вызывается метод __init_subclass__. Таким образом, можно писать классы, которые изменяют поведение подклассов. Это тесно связано с декораторами классов, но там, где декораторы классов влияют только на конкретный класс, к которому они применяются, специальный метод __init_subclass__ применяется исключительно к будущим подклассам класса, определяющего метод.

Синтаксис:

# Новое в Python 3.6.
object.__init_subclass__(cls)

Параметры:

  • cls - новый подкласс.

Описание:

Метод __init_subclass__() вызывается всякий раз, когда содержащий класс является подклассом.

Метод __init_subclass__ является заменой использования метакласса в дереве наследования этого класса.

Аргумент cls - это новый подкласс. Если он определен как обычный метод экземпляра, то этот метод неявно преобразуется в метод класса.

Ключевые аргументы, которые передаются новому классу, передаются родительскому классу в __init_subclass__. Для совместимости с другими классами, использующими специальный метод __init_subclass__, нужно извлечь необходимые ключевые аргументы и передать остальные в базовый класс:

class Philosopher:
    def __init_subclass__(cls, /, default_name, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.default_name = default_name

class AustralianPhilosopher(Philosopher, default_name="Bruce"):
    pass

Реализация object.__init_subclass__ по умолчанию ничего не делает, но вызывает ошибку, если он вызывается с любыми аргументами.

Примечание. Остальная часть механизма типов использует аннотации метакласса metaclass и никогда не передается в реализации __init_subclass__. Только фактический метакласс может получить как тип cls, а не его явная аннотации.