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

