Python 动态子class 包含 __init_subclass__ 钩子的基 class

Python Dynamically subclass a base class containing the __init_subclass__ hook

我对使用 Python 3.6 中提供的新 init_subclass 挂钩感兴趣。参见:pep487

我有一个 class 定义,其定义与上述 link(提案下方)中提供的示例完全相同。现在,我想使用这样的类型动态地子class它:

class Base:
    def __init_subclass__(cls, n, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.max_size = n*n


if __name__ == '__main__':

    dynamic_class = type('DerivedBase', (Base,), {'n':5})

    C = dynamic_class()

    print(C.max_size)

当我尝试这个时,我得到:

c:\temp
λ python test_meta.py
Traceback (most recent call last):
  File "test_meta.py", line 10, in <module>
    dynamic_class = type('DerivedBase', (Base,), {'n':5})
TypeError: __init_subclass__() missing 1 required positional argument: 'n'

请注意,如果我从 class 定义和对 type.

的调用中删除 n 变量,这会很好地工作

这可能吗?如果可以,语法是什么?

只需将命名参数中的参数传递给 __init_subclass__ 到类型调用。

在这种情况下,执行:

 dynamic_class = type('DerivedBase', (Base,), {}, n=5})

有效。 请注意,如果您还使用元类,它也应该接受 __new____init__ 中的额外参数。