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

如何在Protocol中定义属性?Python类型协议属性实现规范咨询

正确实现方案

业内通用的两种符合PEP规范的写法如下,均可以消除PyCharm linter的误报:

方案1:使用省略号作为property方法体

这是最贴近你原有写法的兼容方案,符合PEP 544对Protocol成员的定义要求:

from typing import Protocol

class MyProtocol(Protocol):
    @property
    def my_property(self) -> int:
        ...

说明:

  • 省略号...是Python类型系统约定的「无实现逻辑」标记,专门用于Protocol、存根文件中的方法/属性定义
  • 建议补充返回类型标注,能进一步提升静态类型检查的严谨性

方案2:直接用类变量注解定义属性

这是更简洁的推荐写法,完全不会触发getter相关的linter提示:

from typing import Protocol

class MyProtocol(Protocol):
    my_property: int

说明:

  • Protocol采用结构子类型校验,只要实现类存在可访问的my_property成员(不管是实例变量、类变量还是@property实现的 getter),都会被判定为符合协议要求
  • 这种写法是Python官方文档推荐的普通属性协议定义方式

额外说明

你提到的抛出NotImplementedError的写法确实不适合Protocol场景:Protocol本身仅用于静态类型校验,不需要运行期的抽象检查逻辑,添加运行期异常属于冗余实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:48:03