我对使用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变量,这样就可以了。
这是可能的吗?如果是,那么语法是什么?
答案 0 :(得分:1)
只需将命名参数中__init_subclass__
的参数传递给类型调用。
在这种情况下,执行:
dynamic_class = type('DerivedBase', (Base,), {}, n=5})
的工作原理。
请注意,如果您还使用元类,它也应该接受__new__
或__init__
中的额外参数。