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

9
如何动态创建我的类的子类并向其__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,), {})

1
如果你将关键字参数传递到 type 的参数列表末尾会发生什么?文档暗示着值得一试 :) - Mad Physicist
1
MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), {}, my_name='Ellis') 动态子类 = type("动态子类", (父类,), {}, 名称='艾利斯') - Mad Physicist
1
@EllisPercival 是的,我认为你必须这样做。 - juanpa.arrivillaga
1
@MadPhysicist 噢!那绝对有效! - juanpa.arrivillaga
1
@EllisPercival。感谢您提出这个有趣的问题。我已经有一段时间没有研究元类和类创建了。 - Mad Physicist
显示剩余7条评论
1个回答

12
type的基础文档没有提到它接受无限数量的仅关键字参数,你可以通过在class语句中提供关键字来提供这些参数。唯一提到这一点的地方是在数据模型中的创建类对象部分:
“执行类体后,类命名空间被填充,通过调用metaclass(name, bases, namespace, **kwds)创建类对象(此处传递的附加关键字与传递给__prepare__的关键字相同)。”
通常情况下,您不会使用type的这个特性,正是因为有__init_subclass__
“默认实现object.__init_subclass__什么也不做,但如果使用任何参数调用它,则会引发错误。”
由于您已经覆盖了默认实现,因此可以创建您的动态类,如下:
MyDynamicSubclass = type("MyDynamicSubclass", (MyClass,), {}, my_name="Ellis")

太好了,谢谢!我没有考虑到文档可能会省略那些信息。这很完美 :) - Ellis Percival
1
@EllisPercival。他们并没有刻意省略它,只是没有强调。但我同意他们可以更明确地表达。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接