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

不使用装饰器与继承,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:07:23