Python 3.x中如何通过嵌套属性获取求和值?
实现方案
可以通过自定义节点类+顶层容器类的方式实现需求,核心是利用__getattr__动态处理属性访问,并严格限制合法的嵌套路径:
# 预定义基础值与增量 A_BASE = 0 B_BASE = 1 C_ADD = 2 D_ADD = 4 class SearchRootNode: def __init__(self, base_value): self.base_value = base_value def __getattr__(self, name): # 仅允许C/D作为二级属性 if name == 'C': return self.base_value + C_ADD elif name == 'D': return self.base_value + D_ADD # 非法属性访问直接抛出错误 raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'") # 让节点对象可直接作为数值输出/转换 def __int__(self): return self.base_value def __str__(self): return str(self.base_value) def __repr__(self): return str(self.base_value) class SEARCH: # 顶层仅暴露A/B两个合法入口 A = SearchRootNode(A_BASE) B = SearchRootNode(B_BASE)
测试验证
运行示例代码完全符合预期要求:
print(SEARCH.A) # 输出: 0 print(SEARCH.A.C) # 输出: 2 print(SEARCH.B.D) # 输出: 5 print(SEARCH.A.A) # 抛出AttributeError: 'SearchRootNode' object has no attribute 'A'
代码说明
SearchRootNode类:
- 初始化时接收A/B的基础值(0或1)
__getattr__拦截所有属性访问:仅允许C/D作为二级属性,返回基础值与对应增量的和;其他属性直接抛出AttributeError- 实现
__int__/__str__/__repr__方法,让节点对象可以直接被当作数值输出,满足print(SEARCH.A)输出0的需求
SEARCH类:
- 作为顶层容器,仅暴露A/B两个类属性,对应初始化好的
SearchRootNode实例,确保只有合法的入口路径
- 作为顶层容器,仅暴露A/B两个类属性,对应初始化好的
为什么Enum/Flag不适用?
- Enum:枚举成员是独立实例,若要嵌套需要给每个成员绑定其他枚举,但这样访问
SEARCH.A.C得到的是枚举实例而非数值,且无法限制非法嵌套(比如SEARCH.A.A会返回A枚举本身,不会报错) - Flag:虽然位运算结果和需求的加法一致(0+2=0|2,1+4=1|4),但Flag的设计是支持位组合,
SEARCH.A.A会返回A本身而非报错,不符合非法访问需抛出错误的要求
内容的提问来源于stack exchange,提问作者hornetbzz
相关产品推荐
相关产品推荐

