You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建与父类类型参数不同的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

解释

  1. 泛型基类NumericFoo:它继承泛型的Foo[T],同时包含所有你想复用的功能(比如is_a_number),本身不绑定具体类型,因此可以被不同的子类指定不同的T。
  2. 具体类IntFoo/FloatFoo:通过继承NumericFoo[int]或NumericFoo[float],既获得了通用功能,又绑定了各自的类型参数,类型检查器可以正确推导get_prop()的返回类型。

这样既解决了类型参数冲突的问题,又能复用IntFoo中的通用逻辑。

内容的提问来源于stack exchange,提问作者LondonRob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:39:55