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

Python如何给同时继承父类并实现Protocol的类参数添加类型提示

类型报错原因

你原先的写法Type[tuple[Father, DummyProtocol]]表达的语义是「传入的cls是一个元组类型,元组内元素分别为Father类型和DummyProtocol类型」,和你需要的「传入类同时是Father子类且实现DummyProtocol」的要求完全不符,且元组类型本身不可实例化,因此mypy会抛出对应的报错。

解决方案

方案1:兼容全版本的Protocol继承方案

利用Python Protocol支持继承普通类的特性,定义一个合并两类约束的新Protocol即可,不需要修改原有Foo、Bar类的实现:

from typing import Protocol, Type, TypeVar

# 定义合并约束的新Protocol:要求同时是Father子类、符合DummyProtocol结构
class FatherDummyProtocol(Father, DummyProtocol, Protocol):
    # 无需额外实现任何逻辑,仅作为类型约束使用
    pass

# 声明泛型变量绑定约束,保证返回值类型和传入类的类型严格对应
T = TypeVar('T', bound=FatherDummyProtocol)

def create_dummy_and_father_instance(
    cls: Type[T], *args, **kwargs
) -> T:
    return cls(*args, **kwargs)

方案2:使用交集类型(适合高版本环境)

如果你使用Python 3.11+,或者安装了typing-extensions依赖,可以直接用交集类型Intersection表达「同时满足两个类型约束」的语义:

from typing import Type, Intersection
# 低版本Python替换为 from typing_extensions import Intersection

def create_dummy_and_father_instance(
    cls: Type[Intersection[Father, DummyProtocol]], *args, **kwargs
) -> Intersection[Father, DummyProtocol]:
    return cls(*args, **kwargs)

以上两种方案都可以满足你的要求:传入Foo、Bar类时mypy校验通过,传入不符合「是Father子类+实现DummyProtocol」要求的类时,mypy会主动抛出错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:04