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

如何为继承两个特定类的Python对象提供精准类型提示?

正确的类型提示写法分析

首先明确需求:foo需要接受同时继承BaseClass1和BaseClass2的类的实例(比如MyClass1、MyClass2的对象)。

你的两种写法问题分析

  • 第一种写法:T = type[BaseClass1] & type[BaseClass2]
    这个定义的是类对象的类型(比如BaseClass1、MyClass1这些类本身),而不是实例类型。如果用它标注foo的参数,传入i1(实例)会触发类型检查错误,因为实例不是类对象,完全不符合需求。

  • 第二种写法:T = TypeVar("I18nField", bound= BaseClass1 | BaseClass2)
    这个TypeVar的边界是BaseClass1或BaseClass2的子类,意味着只继承其中一个基类的实例(比如class OnlyBase1(BaseClass1): pass的对象)也能传入foo,范围太宽,不符合你只接受同时继承两个基类实例的需求。

正确的写法

直接用实例交集类型

最直接精准的写法是使用实例的交集类型BaseClass1 & BaseClass2,因为MyClass1和MyClass2的实例同时属于这两个基类的实例:

class BaseClass1:
    pass

class BaseClass2:
    pass

class MyClass1(BaseClass1, BaseClass2):
    pass

class MyClass2(BaseClass1, BaseClass2):
    pass

def foo(ins: BaseClass1 & BaseClass2): 
    pass

i1 = MyClass1()
i2 = MyClass2()
foo(i1)  # 类型检查通过
foo(i2)  # 类型检查通过

复用类型别名(可选)

如果这个类型需要多处使用,可以用TypeAlias定义别名:

from typing import TypeAlias

class BaseClass1:
    pass

class BaseClass2:
    pass

MyCombinedType: TypeAlias = BaseClass1 & BaseClass2

class MyClass1(BaseClass1, BaseClass2):
    pass

class MyClass2(BaseClass1, BaseClass2):
    pass

def foo(ins: MyCombinedType): 
    pass

这样写既能准确限制传入的实例必须同时是两个基类的子类实例,又能通过类型检查工具(比如mypy、pyright)的验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:16:05