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

基于SimpleNamespace,如何用点符号切换访问字典,替代__call__()?

实现可切换的点符号属性访问

要实现无需调用(),直接通过点符号访问选中对象的属性,同时保留切换目标的方法,核心是重写类的__getattr__方法——当访问实例上不存在的属性时,Python会自动调用这个方法,我们可以在这里把属性访问转发到当前选中的目标对象上。

修改后的实现代码

class i: x, y = 1, 2
class j: x, y = 3, 4

class myClass:
    def __init__(self):
        self.a, self.b = i(), j()
        self.selection = "a"
    
    def set_selection(self, selection):
        self.selection = selection
    
    def __getattr__(self, name):
        # 获取当前选中的目标对象
        target = getattr(self, self.selection)
        # 从目标对象中获取属性并返回
        return getattr(target, name)

验证效果

按照你期望的语法调用,完全符合需求:

data = myClass()

print(data.x + data.y) 
#>>> 3
data.set_selection("b")
print(data.x + data.y) 
#>>> 7

注意事项

  • 确保你要访问的属性名(比如x、y)不会和myClass实例自身的属性/方法名冲突(比如set_selection、selection)。如果有冲突,直接访问的会是实例自身的属性,而不会触发__getattr__转发。
  • 如果你需要处理属性不存在的情况,可以在__getattr__里添加异常捕获逻辑,比如:
    def __getattr__(self, name):
        target = getattr(self, self.selection)
        try:
            return getattr(target, name)
        except AttributeError:
            raise AttributeError(f"'{type(target).__name__}' object has no attribute '{name}'") from None
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:35:28