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

Posted

技术标签:

【中文标题】Python:动态创建类,同时为 __init__subclass__() 提供参数【英文标题】:Python: Dynamically create class while providing arguments to __init__subclass__() 【发布时间】:2020-12-07 22:48:23 【问题描述】:

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

示例类:

class MyClass:
    def __init_subclass__(cls, my_name):
        print(f"Subclass created and my name is my_name")

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

class MySubclass(MyClass, my_name="Ellis"):
    pass

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

MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), )

【问题讨论】:

如果将关键字参数传递给参数列表末尾的type,会发生什么?该文档暗示值得尝试:) 例如MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), , my_name='Ellis') @EllisPercival 是的,我认为你必须这样做 @MadPhysicist 哦!这完全有效! @EllisPercival。谢谢你提出一个有趣的问题。我已经有一段时间没有研究元类和类创建了。 【参考方案1】:

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

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

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

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

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

MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), , my_name="Ellis")

【讨论】:

太好了,谢谢!我不认为文档可能会忽略该信息。效果很好:) @EllisPercival。他们不会这样忽略它。他们只是不强调它。但我同意他们可以更明确。

以上是关于Python:动态创建类,同时为 __init__subclass__() 提供参数的主要内容,如果未能解决你的问题,请参考以下文章

python类和对象-扩展

为啥 Python 在创建实例时不调用实例方法 __init__() 而是调用类提供的 __init__() ?

type动态创建类

原创Python 对象创建过程中元类, __new__, __call__, __init__ 的处理

如何在 python 中腌制一个动态创建的嵌套类?

如何从基类动态创建派生类