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

如何在Protocol子类中实现协变初始化参数类型提示无需重复标注?

解决方案

你可以通过在子类继承父类Protocol时显式绑定泛型参数的方式,实现类内部和实例初始化时的类型提示统一,无需重复标注SubRef类型。

代码示例

from typing import Protocol, TypeVar, Generic

# 定义协变类型变量
T_co = TypeVar('T_co', covariant=True)

class BaseRef(Protocol):
    """基础引用协议"""
    pass

class SubRef(BaseRef):
    """子类引用,协变于BaseRef"""
    pass

class Parent(Protocol, Generic[T_co]):
    """带泛型的父类协议,包含默认实现"""
    ref: T_co

    def __init__(self, ref: T_co) -> None:
        self.ref = ref

# 子类显式绑定泛型参数为SubRef
class Child(Parent[SubRef]):
    # 无需重写__init__,自动继承父类签名且类型提示自动替换为SubRef
    pass

# 实例化时的类型提示:参数要求为SubRef,实例的ref属性类型为SubRef
child = Child(SubRef())
# 类内部使用self.ref时,类型检查器也会识别为SubRef

原理说明

  1. 父类Parent通过继承Generic[T_co]并使用协变类型变量T_co,实现了类型的协变支持。
  2. 子类Child在继承时直接指定Parent[SubRef],相当于把父类的泛型占位符T_co替换为具体的SubRef类型。
  3. 类型检查器会自动将父类__init__的参数类型、实例属性类型都替换为SubRef,不管是类内部使用还是外部实例化,都能获得准确的类型提示,无需重复编写类型标注。

如果你的父类Protocol有更多默认方法,这种方式同样适用——只要泛型参数绑定正确,所有依赖T_co的地方都会自动替换为具体类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:12:54