Код: Выделить всё
class ExternalMeta(type):
def __new__(cls, name, base, dct, **kwargs):
dct['district'] = 'Jiading'
x = super().__new__(cls, name, base, dct)
x.city = 'Shanghai'
return x
class MyMeta(ExternalMeta):
def __new__(cls, name, base, dct, age=0, **kwargs):
x = super().__new__(cls, name, base, dct)
x.name = 'Jerry'
x.age = age
return x
def __init__(self, name, base, dct, age=0, **kwargs):
self.country = 'China'
class MyClass(metaclass=MyMeta, age=10):
def __init_subclass__(cls, say_hi, **kwargs):
print(f'keyword arguments are: {kwargs}')
super().__init_subclass__(**kwargs)
cls.hello = say_hi
class DerivedClass(MyClass, say_hi="hello"):
pass
Код: Выделить всё
Traceback (most recent call last):
File "app2.py", line 27, in
class DerivedClass(MyClass, say_hi="hello"):
File "app2.py", line 11, in __new__
x = super().__new__(cls, name, base, dct)
File "app2.py", line 4, in __new__
x = super().__new__(cls, name, base, dct)
TypeError: __init_subclass__() missing 1 required positional argument: 'say_hi'
classmethod object.__init_subclass__(cls)
Этот метод вызывается всякий раз, когда содержащий класс является подклассом. cls — это новый подкласс. Если этот метод определен как обычный метод экземпляра, он неявно преобразуется в метод класса.
Аргументы ключевых слов, передаваемые новому классу, передаются родительскому классу __init_subclass__. Для совместимости с другими классами, использующими __init_subclass__, следует удалить необходимые аргументы ключевого слова и передать остальные базовому классу, как в:
https://docs.python.org/ 3/reference/datamodel.html#object.\_\_init_subclass\_\_
Я пытаюсь напечатать кварги, это {}, пусто, так почему же мои аргументыsay_hi, не передаются в метод __init_subclass__?
редактировать:
Я читаю больше материалы и написать статью с диаграммами и тестами о создании экземпляра и классов на Python:
https://shan-weiqiang.github.io/2023/06 ... class.html
Ссылки на статьи (включая эту страницу) включены в надеется, что это может помочь кому угодно.
Подробнее здесь: https://stackoverflow.com/questions/764 ... t-subclass
Мобильная версия