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

Python类方法装饰器:@调用与动态传参调用的报错问题求助

支持两种调用形式的类方法装饰器实现

要实现同时支持**装饰器语法(静态参数)和动态调用装饰(动态参数)**的类方法装饰器,核心是构建三层嵌套的装饰器结构,确保正确区分装饰器参数、被装饰方法,以及处理类方法的self参数传递。

完整实现代码

def decorator_with_args(arg):
    # 第一层:接收装饰器的自定义参数
    def actual_decorator(func):
        # 第二层:接收被装饰的类方法
        def wrapper(self, *args, **kwargs):
            # 第三层:包装逻辑,先处理装饰器逻辑,再调用原方法
            print(f"Hello, {arg.title()}!")
            # 必须传递self给原方法,保证类方法的正常调用
            return func(self, *args, **kwargs)
        return wrapper
    return actual_decorator

两种用法示例

用法1:静态参数的装饰器语法

class MyClass:
    @decorator_with_args('World')
    def add1(self, a, b):
        return a + b

obj = MyClass()
print(obj.add1(2, 3))
# 输出:
# Hello, World!
# 5

用法2:动态参数的调用式装饰

# 动态生成装饰器参数
dynamic_suffix = 456

class MyClass2:
    def add2(self, a, b):
        return a + b

# 动态创建装饰器并装饰类方法
MyClass2.add2 = decorator_with_args(f'World{dynamic_suffix}')(MyClass2.add2)

obj2 = MyClass2()
print(obj2.add2(4, 5))
# 输出:
# Hello, World456!
# 9

原报错原因分析

  • TypeError: takes 3 positional arguments but 4 were given:原装饰器的包装函数未正确接收self参数,导致类方法调用时自动传入的self被当成额外参数传递给原方法,加上原方法的参数,总参数数量超出预期。
  • AttributeError: 'int' object has no attribute 'title':原装饰器结构错误,未区分装饰器参数和被装饰方法,导致把类方法的self(这里是实例对象或类本身)当成了装饰器的arg参数,调用title()方法时自然报错。

内容的提问来源于stack exchange,提问作者Prasun Kumar Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:42:41