【问题标题】:Python: Dynamically create class while providing arguments to __init__subclass__()Python:动态创建类,同时为 __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。谢谢你提出一个有趣的问题。我已经有一段时间没有研究元类和类创建了。

标签: python python-3.x inheritance metaprogramming metaclass


【解决方案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。他们不会这样忽略它。他们只是不强调它。但我同意他们可以更明确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多