Code: Select all
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
Code: Select all
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)
Diese Methode wird immer aufgerufen Die enthaltende Klasse ist eine Unterklasse. cls ist dann die neue Unterklasse. Wenn diese Methode als normale Instanzmethode definiert ist, wird sie implizit in eine Klassenmethode konvertiert.
Schlüsselwortargumente, die einer neuen Klasse übergeben werden, werden an die übergeordnete Klasse __init_subclass__ übergeben. Aus Gründen der Kompatibilität mit anderen Klassen, die __init_subclass__ verwenden, sollte man die benötigten Schlüsselwortargumente herausnehmen und die anderen an die Basisklasse übergeben, wie in:
https://docs.python.org/ 3/reference/datamodel.html#object.\_\_init_subclass\_\_
Ich versuche, Kwargs zu drucken, das ist es {}, leer, also warum werden meine say_hi, Argumente nicht an die Methode __init_subclass__ übergeben?
Bearbeiten:
Ich habe mehr gelesen Materialien und schreiben Sie einen Artikel mit Diagrammen und Tests über die Erstellung von Instanzen und Klassen in Python:
https://shan-weiqiang.github.io/2023/06 ... class.html
Verweise auf Artikel (einschließlich dieser Seite) sind enthalten in Ich hoffe, es kann jedem helfen.