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 在创建实例时不调用实例方法 __init__() 而是调用类提供的 __init__() ?