代码之家  ›  专栏  ›  技术社区  ›  user1050619

Python将self传递给decorator

  •  6
  • user1050619  · 技术社区  · 7 年前

    我想通过考试 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)
    
    1 回复  |  直到 3 年前
        1
  •  12
  •   Amit Tripathi    7 年前

    以下是您的操作方式:

    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
    

    此外,当您需要将一些参数传递给decorator(如 @log_real_decorator(some_param=1) . 在您的情况下,您不需要这样做,相反,您应该做的是创建一个具有两个嵌套函数的装饰器,就像我在上面所做的那样,并将其称为 @log_real_decorator .