Аргумент ключевого слова класса - это любой аргумент kwyword, который передается в объявлении класса.Только один такой аргумент имеет специальную обработку - metaclass=
- этот диктует вызываемую функцию, которая будет использоваться для предоставления метакласса.
Любой другой аргумент ключевого слова, переданный метаклассу __new__
и * как есть.Методы 1005 * и любой метод суперкласса __init_subclass__
.Они не обрабатываются особым образом и, прежде всего, не являются «базовыми классами» - упомянутые выше методы обычно получают эти ключевые аргументы как любой метод Python: они могут быть объявлены в сигнатуре метода или могут принять**kwargs
словарь (что имеет место).
Стоит отметить, что при передаче таких аргументов с помощью надлежащего метода __init_subclass__
в суперклассах, которые его "проглотят", объявление класса завершится неудачно с TypeError
из-за нераспознанного аргумента object
__init_subclass__
.Напротив, реализация метакласса по умолчанию __new__
и __init__
в классе type
будет просто игнорировать любые переданные дополнительные ключевые слова.
Таким образом:
In [1]: class A(test=None):
...: pass
...:
завершается неудачно с:
TypeError: __init_subclass__() takes no keyword arguments
Пока:
In [2]: class A:
...: def __init_subclass__(cls, **kwd):
...: super().__init_subclass__(cls)
...:
In [3]: class B(A, test=None):
...: pass
...:
работает без проблем.(A.__init_subclass__
Квадрат будет передан {"test": None}
)