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

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'

代码说明

  1. SearchRootNode类:

    • 初始化时接收A/B的基础值(0或1)
    • __getattr__拦截所有属性访问:仅允许C/D作为二级属性,返回基础值与对应增量的和;其他属性直接抛出AttributeError
    • 实现__int__/__str__/__repr__方法,让节点对象可以直接被当作数值输出,满足print(SEARCH.A)输出0的需求
  2. SEARCH类:

    • 作为顶层容器,仅暴露A/B两个类属性,对应初始化好的SearchRootNode实例,确保只有合法的入口路径

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:47:21