如何将未知的参数列表发送给python装饰器 - 当装饰器是不同类的方法时?

时间:2017-06-06 18:57:09

标签: python decorator python-decorators

这个问题与我刚问过的another question有关。

我创建了一个python装饰器,如下所示。我希望这个装饰器接受一个未知的参数列表。但是还有一个额外的皱纹。装饰器是另一个类的实例方法:

#!/usr/bin/env python
from functools import wraps


class A:

    def my_decorator(self, func=None, **kwargs):

        def inner_function(decorated_function):

            def wrapped_func(*fargs, **fkwargs):
                print kwargs
                return decorated_function(*fargs, **fkwargs)
            return wrapped_func

        if func:
            return inner_function(func)
        else:
            return inner_function

class B:
    my_a = A()

    @my_a.my_decorator(arg_1="Yolo", arg2="Bolo")
    def my_func():
         print "Woo Hoo!"


my_B = B()
B.my_func()

但是下面的代码不起作用:

Traceback (most recent call last):
  File "./decorator_test.py", line 30, in <module>
    B.my_func()
TypeError: unbound method wrapped_func() must be called with B instance as first argument (got nothing instead)

如何解决?

1 个答案:

答案 0 :(得分:0)

这是我对装饰师进行编码的方法:

class A:
    def __init__(self, func=None, **kargs):
        self.args  = func
        self.kargs = kargs 
    def __call__(self, decorated_function): 
        def wrapper_func(*args, **kargs):
            print kargs
            return decorated_function(*args, **kwargs)
        if self.func:
            #..do something..
            return wrapper_func
        elif 'xyz' in self.kargs:
            #...do something else here..
            return wrapper_func
        else:
            ...


class B:
    @A(arg_1="Yolo", arg2="Bolo")              # A(...)(my_func)
    def my_func():
        print "Woo Hoo!"

这是编码装饰器的典型方法。类A在调用时返回可调用对象。类A的可调用对象将被自动调用以进行修饰。调用可调用对象时,会触发其__call__方法,并且其__call__运算符重载方法在执行某些自定义后返回包装函数。包装器函数是围绕原始函数包装逻辑的函数。