【问题标题】:How to pass `__init_subclass__` keyword arguments when using `type`?使用`type`时如何传递`__init_subclass__`关键字参数?
【发布时间】:2021-06-17 18:11:28
【问题描述】:

我有一个接受关键字参数的类,这是在 Python 3.6 中与 __init_subclass__ 一起引入的:

class Parent:
  def __init_subclass__(cls, key=None, **kwargs):
    super().__init_subclass__(**kwargs)
    assert key is not None

class Child(Parent, key=5):
  pass

Child2 = type("Child2", (Parent,), {})

但它给出了一个AssertionError,因为没有通过key。如果我尝试提供额外的参数字典,则会收到以下错误:

>>> type("Child2", (Parent,), {}, {"key": 5})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type() takes 1 or 3 arguments

而且type 函数的文档也不允许指定它们。我怎样才能将这些 kwargs 传递给__init_subclass__

【问题讨论】:

    标签: python metaclass


    【解决方案1】:

    您可以将关键字参数传递给type() 调用:

    Child2 = type("Child2", (base,), {}, key=5)
    

    自 Python 3.6.0 起,这与 __init_subclass__ 一起可用,但实际上是 Python 文档中的一个疏忽。它已在 Python 3.10 开发文档 (here) 中得到更正,其 type() 签名向您展示了如何做到这一点:

    type(name, bases, dict, **kwds)
    

    并说明这种可能性:

    提供给三参数形式的关键字参数被传递给适当的元类机制(通常是__init_subclass__()),其方式与类定义(元类除外)中的关键字相同。

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 2020-12-06
      • 1970-01-01
      • 2019-08-23
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多