如何在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
相关产品推荐
相关产品推荐

