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

