Warum werden Schlüsselwortargumente nicht an __init_subclass__(..) übergeben?Python

Python-Programme
Guest
 Warum werden Schlüsselwortargumente nicht an __init_subclass__(..) übergeben?

Post by Guest »

Code:

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
dies löst Folgendes aus:

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'
Aus dem offiziellen Dokument:

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post