Python 3.x Python动态地子类化包含_init_子类_钩子的基类

Python 3.x Python动态地子类化包含_init_子类_钩子的基类,python-3.x,metaclass,Python 3.x,Metaclass,我对使用Python 3.6中提供的新的init_子类hook感兴趣。见: 我有一个类,其定义方式与上述链接中提供的示例完全相同(建议下方)。现在,我想使用如下类型动态地将其子类化: class Base: def __init_subclass__(cls, n, **kwargs): super().__init_subclass__(**kwargs) cls.max_size = n*n if __name__ == '__main__':

我对使用Python 3.6中提供的新的init_子类hook感兴趣。见:

我有一个类,其定义方式与上述链接中提供的示例完全相同(建议下方)。现在,我想使用如下类型动态地将其子类化:

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'
c:\temp
λpython测试_meta.py
回溯(最近一次呼叫最后一次):
文件“test_meta.py”,第10行,在
dynamic_class=type('DerivedBase',(Base,),{'n':5})
TypeError:\uuuu init\u子类\uuuuu()缺少1个必需的位置参数:“n”
请注意,如果我从类定义和对
type
的调用中删除n变量,那么这种方法就可以正常工作


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

只需将命名参数中的参数传递给类型调用中的
\uuu init\u subclass\uu

在这种情况下,执行以下操作:

 dynamic_class = type('DerivedBase', (Base,), {}, n=5})
工作。
只要注意,如果您也使用元类,它应该接受
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,不清楚它是否可以接受这样的命名参数。我个人的问题是,关键字
元类
非常特殊,与任何其他关键字参数相比都是不对称的,而不使用通常的
\uuuuu
前缀和后缀。@jsbueno知道为什么没有正确地记录在任何地方吗?哇,在阅读了
\uuu init\u subclass\uuu
type
的文档后,很高兴发现我不是唯一一个出现此问题的人。