Python 将 self 传递给装饰器

Posted

技术标签:

【中文标题】Python 将 self 传递给装饰器【英文标题】:Python passing self to the decorator 【发布时间】:2018-05-28 22:31:54 【问题描述】:

我正在尝试将 self 对象传递给我的装饰器以访问其内容,但出现以下错误:

def log_decorator():
    def log_real_decorator(f):
        @wraps(f)
        def wrapper(self,*args, **kw):      
            print "I am the decorator, I know that self is", self, "and I can do whatever I want with it!"
            print "I also got other args:", args, kw           
            f(*args, **kw)

        return wrapper        
    return log_real_decorator    

class Foo(object):
    @log_decorator

    def meth(self):
        print "I am the method, my self is", self


f = Foo()        
f.meth()

错误:-

TypeError: log_decorator() takes no arguments (1 given)

【问题讨论】:

你得到一个错误,因为log_decorator 没有将函数作为参数,它返回的函数是,所以至少要了解你要去哪里错误的将其更改为@log_decorator() 或删除额外的功能层并在全局级别使用log_real_decorator,然后您将得到更相关的错误。 【参考方案1】:

这就是你的做法:

def log_real_decorator(f):
    @wraps(f)
    def wrapper(self, *args, **kw):      
        print "I am the decorator, I know that self is", self, "and I can do whatever I want with it!"
        print "I also got other args:", args, kw           
        f(self, *args, **kw)
        # ^ pass on self here

    return wrapper

只需传递self

或者

如果您想创建一个可用于类和方法的通用装饰器,您只需这样做:

def log_real_decorator(f):
    @wraps(f)
    def wrapper(*args, **kw):
        # Do something here
        f(*args, **kw)

    return wrapper

此外,当您需要将一些参数传递给装饰器时使用您创建的装饰器(例如@log_real_decorator(some_param=1)。在您的情况下,您不需要那个,而是应该做的是创建一个装饰器我在上面所做的两个嵌套函数,并将其称为@log_real_decorator

【讨论】:

以上是关于Python 将 self 传递给装饰器的主要内容,如果未能解决你的问题,请参考以下文章

将实例变量传递给装饰器

如何将装饰器中的变量传递给装饰函数中的函数参数?

python3 如何给装饰器传递参数

python装饰器

python - 用类写装饰器

python 类装饰器