Python:在为 __init__subclass__() 提供参数的同时动态创建类

Ell*_*val 6 python inheritance metaprogramming metaclass python-3.x

如何动态创建我的类的子类并为其__init_subclass__()方法提供参数?

示例类:

class MyClass:
    def __init_subclass__(cls, my_name):
        print(f"Subclass created and my name is {my_name}")
Run Code Online (Sandbox Code Playgroud)

通常我会这样实现我的子类:

class MySubclass(MyClass, my_name="Ellis"):
    pass
Run Code Online (Sandbox Code Playgroud)

但是在my_name动态创建MyClass使用元类的子类时我将如何传入?通常我可以使用,type()但它没有提供my_name.

MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), {})
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 8

的基本文档type没有提到它接受无限数量的仅关键字参数,您可以通过class语句中的关键字提供这些参数。唯一暗示这一点的地方是在创建类对象部分的数据模型中:

通过执行类主体填充类命名空间后,通过调用创建类对象metaclass(name, bases, namespace, **kwds)(此处传递的附加关键字与传递给 的关键字相同__prepare__)。

通常,您不会使用此功能,type因为__init_subclass__

默认实现object.__init_subclass__什么都不做,但如果使用任何参数调用它,则会引发错误。

由于您已经覆盖了默认实现,因此您可以将动态类创建为

MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), {}, my_name="Ellis")
Run Code Online (Sandbox Code Playgroud)