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

如何为接收类参数并返回其子类的函数添加类型提示?

为动态生成子类的函数添加类型提示

原场景代码

# 某个基础类,可能来自当前模块、标准库或其他地方
class FooBase:
    pass

# 用户定义的子类
class FooDerived(FooBase):
    pass

# foo() 接收任何FooBase类型(包括其子类)
def foo(baseclass: FooBase) -> ?: 
    class Inner(baseclass):
        pass
    return Inner

# NewFoo 必须是FooBase的子类,继承自FooDerived
NewFoo = foo(FooDerived)

这里的Inner是传入的baseclass的子类型,需要为foo函数添加类型提示,明确它返回的是类本身(而非类的实例),且该类是传入baseclass的子类型。


解决方案:使用泛型类型提示

可以通过typing模块的TypeVar和Type(Python 3.10+可用type)来实现这类动态子类的类型标注,让类型检查器能正确识别类的继承关系。

完整示例(Python 3.9及以上)

from typing import TypeVar, Type

class FooBase:
    pass

class FooDerived(FooBase):
    pass

# 定义绑定到FooBase的类型变量,限制只能是FooBase或其子类
TFoo = TypeVar('TFoo', bound=FooBase)

def foo(baseclass: Type[TFoo]) -> Type[TFoo]:
    class Inner(baseclass):
        pass
    return Inner

# 类型检查器会自动识别NewFoo是FooDerived的子类,同时属于FooBase体系
NewFoo = foo(FooDerived)

Python 3.10+ 简化写法(PEP 604语法)

from typing import TypeVar

class FooBase:
    pass

class FooDerived(FooBase):
    pass

TFoo = TypeVar('TFoo', bound=FooBase)

def foo(baseclass: type[TFoo]) -> type[TFoo]:
    class Inner(baseclass):
        pass
    return Inner

NewFoo = foo(FooDerived)

说明

  • Type[TFoo](或Python 3.10+的type[TFoo])表示**TFoo类型的类对象**,而非TFoo的实例,刚好匹配函数接收和返回类的需求。
  • bound=FooBase限制了TFoo只能是FooBase或其子类,确保函数参数的合法性,同时让类型检查器能推断出返回的Inner类是传入baseclass的子类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:58:26