如何定义标识带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
相关产品推荐
相关产品推荐

