Python:从另一个类调用装饰器方法

时间:2015-09-18 15:30:46

标签: python class decorator

我们说我有一个定义装饰器的类

<div class="quicklinks">
    <span class="glyphicon glyphicon-chevron-up"></span>
</div>

然后我决定在另一个类中调用那个装饰器:

class Foo():

    def decorate(param):        
        def wrapper(func):
            def wrapped(*args, **kwargs):
                # do something
                return func(*args, **kwargs)
            return wrapped
        return wrapper

这会引发class Bar(): foo = Foo() param = something @foo.decorate(param) def func(): # do something 例外:

TypeError

我无法理解这里出了什么问题。应用相同的装饰器,但在同一个类TypeError: decorate() takes 1 positional argument but 2 were given 中定义的工作正常,但为什么它不适用于不同的类?

2 个答案:

答案 0 :(得分:1)

你的decorate()函数应该是一个实例方法,因此它接受实例本身作为第一个参数,当你调用 - @foo.decorate(param)时,你试图传递两个参数(自{{ 1}}是实例本身的foo类的实例,以及导致该问题的Foo

您应该将param方法转换为接受实例作为第一个参数。示例 -

decorate()

另一方面,您的class Foo(): def decorate(self, param): def wrapper(func): def wrapped(*args, **kwargs): # do something return func(*args, **kwargs) return wrapped return wrapper 也是一种实例方法,也需要func()。示例 -

self

答案 1 :(得分:1)

你只是忘了包含$("#Ebda2").append('<div class="water"> ...every thing inside... </div>'); ;你正在调用绑定方法self,所以实例将被传入:

Foo().decorate()

请注意,这同样适用于您的class Foo(): def decorate(self, param): 功能:

Bar.func()