问题描述
如何动态创建类的子类并为其__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
但是当使用元类动态创建my_name
的子类时,如何传递MyClass
?通常我可以使用type()
,但是它没有提供my_name
的选项。
MyDynamicSubclass = type("MyDynamicSubclass",(MyClass,),{})
解决方法
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")