繁体   English   中英

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

[英]Python: Calling a decorator method from another class

假设我有一个定义装饰器的类

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

我不明白这里出了什么问题。 应用相同的装饰器但在同一类Bar定义的效果很好,但是为什么它不能在不同的类中使用呢?

您的decorate()函数应为实例方法,因此它接受实例本身作为第一个参数,当您调用- @foo.decorate(param) ,您尝试向其传递两个参数(因为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 范例-

class Bar():

    foo = Foo()
    param = something

    @foo.decorate(param)
    def func(self):
        # do something

你只是忘记包含self ; 您正在调用Foo().decorate() ,这是一个绑定方法,因此该实例将传入:

class Foo():
    def decorate(self, param):        

请注意,这同样适用于您的Bar.func()函数:

class Bar():

    foo = Foo()
    param = something

    @foo.decorate(param)
    def func(self):
        # do something

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM