如何创建与父类类型参数不同的Python泛型子类?
解决方案
你的问题核心在于:IntFoo已经是绑定了int类型的具体类(继承自Foo[int]),不再是泛型类,因此无法再传入新的类型参数;而多继承Foo[float]和IntFoo会导致类型参数冲突(一个要求T=int,一个要求T=float),所以IDE提示不兼容。
要实现继承IntFoo的通用功能(比如is_a_number属性)同时替换类型参数,需要重构基类结构,把通用功能抽成泛型基类,而非直接绑定具体类型的类:
重构代码示例
class Foo[T]: prop: T def get_prop(self) -> T: return self.prop # 抽离通用的数值类功能,做成泛型基类,继承泛型Foo class NumericFoo[T](Foo[T]): @property def is_a_number(self) -> bool: return True # 原来的IntFoo现在是绑定int的具体类,继承泛型NumericFoo class IntFoo(NumericFoo[int]): prop: int = 42 def do_thing(self): reveal_type(self.get_prop()) # int # FloatFoo继承泛型NumericFoo并指定float类型,自动获得is_a_number属性 class FloatFoo(NumericFoo[float]): prop: float = 42.0 def do_thing(self): reveal_type(self.get_prop()) # float
解释
- 泛型基类
NumericFoo:它继承泛型的Foo[T],同时包含所有你想复用的功能(比如is_a_number),本身不绑定具体类型,因此可以被不同的子类指定不同的T。 - 具体类
IntFoo/FloatFoo:通过继承NumericFoo[int]或NumericFoo[float],既获得了通用功能,又绑定了各自的类型参数,类型检查器可以正确推导get_prop()的返回类型。
这样既解决了类型参数冲突的问题,又能复用IntFoo中的通用逻辑。
内容的提问来源于stack exchange,提问作者LondonRob
相关产品推荐
相关产品推荐

