如何在Python泛型基类中获取泛型类属性?
解决方案
要在BaseClass内部实现通过子类直接获取泛型参数类名的功能,可利用Python的泛型类型解析工具,从子类的原始基类信息中提取泛型参数。具体实现如下:
首先导入必要的类型工具:
from typing import Generic, TypeVar, AbstractBaseClass, get_args, get_origin
定义类型变量和基类:
T = TypeVar('T') class BaseClass(AbstractBaseClass, Generic[T]): @classmethod @property def targetType(cls) -> str: # 遍历子类的原始基类(包含泛型参数的完整定义) for base in cls.__orig_bases__: # 判断当前基类是否是BaseClass的泛型实例 if get_origin(base) is BaseClass: # 提取泛型参数并返回类名 target_class = get_args(base)[0] return target_class.__name__ raise ValueError("当前子类未指定BaseClass的泛型参数")
使用示例:
class Someclass: pass class ExampleClass(BaseClass[Someclass]): pass # 直接通过类属性获取目标类名 print(ExampleClass.targetType) # 输出: Someclass
说明
__orig_bases__是Python 3.7+提供的属性,保存了类定义时的原始基类(包含泛型参数的完整信息)。get_origin用于判断基类是否是指定泛型类的实例,get_args则提取泛型参数。- 通过类属性
targetType的方式,完全满足你希望通过ExampleClass.targetType直接访问的需求,无需在每个子类中重复编写代码。
内容的提问来源于stack exchange,提问作者Jiew Meng
相关产品推荐
相关产品推荐

