不使用装饰器与继承,Python类调用其他类方法的优化方案
更符合Python风格的实现方案
针对需求,我们可以把方法包装逻辑直接整合到__getattr__魔术方法中,无需额外定义装饰器,写法更简洁且贴合Python惯用风格:
class Foo: def __init__(self, arg: str): self.bar = arg def __getattr__(self, item): # 获取字符串bar对应的目标方法 str_method = getattr(self.bar, item) def wrapper(*args, **kwargs): result = str_method(*args, **kwargs) # 若返回值为字符串,自动更新bar属性 if isinstance(result, str): self.bar = result return self # 可选:开启链式调用支持 return result return wrapper # 测试示例 foo = Foo(' hello world ') print(foo.bar) # 输出: ' hello world ' foo.strip() print(foo.bar) # 输出: 'hello world' # 链式调用演示(需开启return self) foo.upper().replace('WORLD', 'PYTHON') print(foo.bar) # 输出: 'HELLO PYTHON'
方案说明
- 逻辑内聚:将方法包装逻辑直接放在
__getattr__内部,省去外部装饰器的冗余代码,代码结构更紧凑。 - 自动更新:调用字符串方法后,自动检查返回值类型,若为字符串则更新
self.bar,无需手动赋值。 - 灵活扩展:可选添加
return self实现链式调用,让代码书写更流畅;若不需要该特性,删除此行即可。
为什么更符合Python风格?
- 利用
__getattr__的原生特性:仅在访问类自身未定义的属性/方法时触发逻辑,不会干扰Foo类的自有方法。 - 封装性更强:所有和字符串方法代理相关的逻辑都封装在类内部,可读性和维护性更优。
- 避免额外命名空间占用:无需外部装饰器,逻辑完全归属Foo类本身,符合Python"简洁直观"的设计理念。
内容的提问来源于stack exchange,提问作者InSync
相关产品推荐
相关产品推荐

