Python枚举成员为何会出现所有成员作为属性的无限递归现象?
Python枚举成员可无限链式访问的原因
这其实是Python标准库Enum类的刻意设计,核心逻辑如下:
枚举实例的全局成员映射
Python的Enum类在生成枚举实例时,会把整个枚举类的所有成员(包括自身)存入每个实例的内部成员映射(对应__members__属性)里。同时为了访问便捷,Enum实现了属性代理机制——当你通过枚举实例访问某个成员名(比如t1.m2)时,它会直接从这个内部映射里取出对应的枚举实例返回。无重复创建的链式访问
每次链式访问(比如t1.m2.m3),本质都是从当前枚举实例的成员映射里获取已存在的枚举实例,并不会生成新对象。所以不管你链式访问多少次,每次拿到的都是原枚举类中定义好的成员实例,自然能一直“链式跳转”下去,直到你访问.value这类属性拿到具体值。
拿你给出的代码举例:
from enum import Enum class TT(Enum): m1 = 1 m2 = 2 m3 = 3 t1 = TT['m1'] t1.m2.m3.m3.m1.m2.m2.m1.m3.value >>> 3
t1.m2返回的是TT.m2实例,TT.m2.m3返回TT.m3实例,后续的链式访问都是重复这个取值过程,最后.value读取的就是TT.m3对应的数值3。
这种设计的目的是让枚举实例具备和枚举类一致的成员访问能力,让代码更直观易读。
内容的提问来源于stack exchange,提问作者mahkitah
相关产品推荐
相关产品推荐

