能否让父类将所有子类的Type类型设为ClassVar类变量?
实现父类ClassVar存储所有子类类型的方案
当然可以实现,核心思路是利用Python的__init_subclass__钩子,在每个子类被创建时自动将其类型注册到父类的sub_types变量中。
具体实现代码
from typing import ClassVar, List, Type class A: # 初始化ClassVar,先包含父类自身 sub_types: ClassVar[List[Type["A"]]] = [A] # 子类创建时自动触发的钩子方法 def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # 将当前子类添加到父类的sub_types列表 A.sub_types.append(cls) class B(A): pass class C(A): pass class D(A): pass
效果验证
运行后:
A.sub_types的值为[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]- 由于
sub_types是属于类A的ClassVar,子类B、C、D访问该变量时会直接引用父类的属性,所以B.sub_types、C.sub_types、D.sub_types的值和A.sub_types完全一致。
额外说明
如果存在多层继承(比如E继承自B),为了避免重复注册,可以在__init_subclass__里加个判断:
def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) if cls not in A.sub_types: A.sub_types.append(cls)
内容的提问来源于stack exchange,提问作者HiroIshida
相关产品推荐
相关产品推荐

