基于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
相关产品推荐
相关产品推荐

