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

如何定义标识带b属性的Base子类的Python类型提示(无法导入子类)

解决方案

要定义TIsBaseWithB来描述"继承自Base且拥有b属性"的类型,你需要用Protocol(Python类型系统的结构子类型支持),和NewType无关,具体实现如下:

1. 定义Protocol类型

首先导入Protocol(Python 3.8+自带于typing模块,3.7及以下需从typing_extensions导入),然后定义一个继承自Base的Protocol,并声明b属性:

from typing import Protocol
# 假设你可以正常导入Base类
from your_module import Base

class TIsBaseWithB(Protocol, Base):
    b: int

如果不需要严格限定必须是Base的子类,仅要求拥有a和b属性,也可以直接定义结构:

class TIsBaseWithB(Protocol):
    a: int
    b: int

2. 在函数中使用该类型提示

之后就可以在函数中使用TIsBaseWithB作为参数类型,类型检查器会自动识别所有符合结构的对象(比如Derived1、Derived2),且无需导入这两个子类:

def uses_b(b_supporting_object: TIsBaseWithB):
    # 类型检查器会认可b属性的存在,不会报错
    print(b_supporting_object.b)

3. 为什么不用NewType?

NewType只是创建一个逻辑上的类型别名,仅用于区分同一基础类型的不同语义用途,不会添加任何属性或结构检查。比如:

from typing import NewType
TIsBaseWithB = NewType('TIsBaseWithB', Base)

这种定义下,类型检查器只会验证传入的是Base实例,但不会检查是否存在b属性,完全满足不了你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:55:17