Python使用__getattr__实现包装类传递self.label的方案咨询
解决方案
错误原因
你原有写法中a.self.label的逻辑完全错误:访问a.self时会触发Alpha类的__getattr__方法,将Alpha实例的label设为字符串'self',根本无法获取到Beta实例存储的label值。
实现方式
当执行b.bar.b_function()时,Beta实例已经通过自身的__getattr__方法将bar存储到了实例的self.label属性中,你只需要把这个值传递给Alpha实例即可,以下是两种可行实现:
方案1:直接赋值(最简单高效)
class Beta: def __getattr__(self, label): self.label = label return self def b_function(self): a = Alpha() # 直接把Beta实例存储的label赋值给Alpha实例 a.label = self.label a.a_function()
方案2:沿用Alpha原生调用逻辑
如果你希望严格遵循Alpha类原本通过属性访问设置label的设计风格,可以用getattr实现:
class Beta: def __getattr__(self, label): self.label = label return self def b_function(self): a = Alpha() # 等效于执行 a.bar.a_function(),和Alpha的原生调用逻辑完全一致 getattr(a, self.label).a_function()
两种方案执行测试代码b = Beta(); b.bar.b_function()都可以正常输出Label: bar。
内容的提问来源于stack exchange,提问作者YTKme
相关产品推荐
相关产品推荐

