Python 类 中带有额外参数的装饰器

Python decorators in classes with extra parameters

我读了这个

one answer 还有这个 another answer

但我没有正确使用参数

class decoratortest:
    def dec(func):
        def wrapper(self,*args,**kwargs):
            func(*args,**kwargs)
            func(*args,**kwargs)
        return wrapper

    @dec
    def printer(self,a):
        print(a)
        
    def dectest(self):
        self.printer('hi')
x = decoratortest()
x.dectest()

我得到了通常的位置错误参数。我可以打印两次 hi 的正确语法是什么?

对于未来,这行得通:

class decoratortest:
    def dec(func):
        def wrapper(self,*args,**kwargs):
            func(self,*args,**kwargs)
            func(self,*args,**kwargs)
        return wrapper

    @dec
    def printer(self,a):
        print(a)
        
    def dectest(self):
        self.printer('hi')
x = decoratortest()
x.dectest()

非常棘手,您不在装饰器中键入 self,但在底层包装器和函数项中键入。

您必须显式传递 self,因为 func 是对常规 function 对象的引用,而不是 self.printer 生成的 method 对象(通过 descriptor protocol):

def dec(func):
    def wrapper(self, *args, **kwargs):
        func(self, *args, **kwargs)
        func(self, *args, **kwargs)
    return wrapper

或者您可以将装饰器放在 class

之外
def dec(func):
    def wrapper(*args, **kwargs):
        func(*args, **kwargs)
        func(*args, **kwargs)

    return wrapper


class decoratortest:
    @dec
    def printer(self, a):
        print(a)

    def dectest(self):
        self.printer('hi')


x = decoratortest()
x.dectest()

输出:

hi
hi
class decoratortest:
    def dec(func):
        def wrapper(self,*args,**kwargs):
            func(*args,**kwargs)
            func(*args,**kwargs)
        return wrapper

    @dec
    def printer(self,a='hi'):
        print(a)
        
    def dectest(self):
        self.printer('hi')
        
x = decoratortest()
x.dectest()

在未指定参数且有效时为装饰器添加了默认值。