Когда класс наследуется от другого класса, то для этого класса вызывается метод __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
, а не его явная аннотации.