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

如何列出Python Protocol类中未赋值的静态成员?

如何获取Protocol类中仅声明类型的静态成员

当定义继承自Protocol的类时,仅声明类型但未赋值的静态成员(比如示例中的MY_STATIC_MEMBER_2)不会被dir()、常规inspect方法或__mro__检测到——这类成员只存在于类的类型注解元数据中,而非类的属性字典里。以下是两种可行的获取方法:

方法1:直接访问__annotations__属性

Protocol类的所有类型注解(包括仅声明未赋值的成员)都会被存储在类的__annotations__字典中,直接读取这个字典的键就能得到目标成员列表:

from typing import Protocol

class Foo(Protocol):
    MY_STATIC_MEMBER_1: int = 42
    MY_STATIC_MEMBER_2: int

# 获取所有带类型注解的静态成员
annotated_members = list(Foo.__annotations__.keys())
print(annotated_members)  # 输出: ['MY_STATIC_MEMBER_1', 'MY_STATIC_MEMBER_2']

# 如果需要同时包含已赋值的非注解成员(若有),可以结合dir()去重
assigned_members = [attr for attr in dir(Foo) if not attr.startswith('__')]
all_static_members = list(set(annotated_members + assigned_members))
print(all_static_members)

方法2:使用typing.get_type_hints()

get_type_hints()函数可以递归获取类的所有类型注解,包括继承自父Protocol的成员,适合复杂继承场景:

from typing import Protocol, get_type_hints

class Foo(Protocol):
    MY_STATIC_MEMBER_1: int = 42
    MY_STATIC_MEMBER_2: int

type_hints = get_type_hints(Foo)
all_annotated_members = list(type_hints.keys())
print(all_annotated_members)  # 输出: ['MY_STATIC_MEMBER_1', 'MY_STATIC_MEMBER_2']

原理说明

Python中,仅声明类型的成员会被存入类的__annotations__字典,但Protocol类的设计逻辑不会将这类未赋值成员添加到类的__dict__中,因此dir()这类遍历属性字典的方法无法检测到它们。而__annotations__和get_type_hints()是直接读取类型注解元数据的方式,不受成员是否赋值的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:50:34