Python动态子类化包含__init_subclass__钩子的基类

时间:2018-01-15 17:18:02

标签: python-3.x metaclass

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

我的定义方式与上述链接中提供的示例完全相同(在Proposal下方)。现在,我想使用如下类型动态子类化它:

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'

请注意,如果我从类定义和type的调用中删除n变量,这样就可以了。

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

1 个答案:

答案 0 :(得分:1)

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

在这种情况下,执行:

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

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