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__
中的额外参数。
我对使用 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
.
这可能吗?如果可以,语法是什么?
只需将命名参数中的参数传递给 __init_subclass__
到类型调用。
在这种情况下,执行:
dynamic_class = type('DerivedBase', (Base,), {}, n=5})
有效。
请注意,如果您还使用元类,它也应该接受 __new__
或 __init__
中的额外参数。