【问题标题】:Decorate class-method with class-decorator用类装饰器装饰类方法
【发布时间】:2014-01-14 06:22:05
【问题描述】:

我正在尝试使用类装饰器来装饰类方法。例如

class MyDecorator(object):
    def __init__(self,param1):
        self.param1 = param1
        # do some action with param1

    def __call__(self,func):
        def wrapped(*args,**kwargs):
             print "in wrapper:"
             func(*args,**kwargs)

        return wrapped

还有我的一些班级:

class A:
    @MyDecorator("Blablabla")
    def func1(arg1,arg2,arg3):
         print (arg1,arg2,arg3)

但是当我做下一个动作时:

a = A()
a.func(1,2,3)

我收到以下错误:

TypeError: func1() takes exactly 3 arguments (4 given)

【问题讨论】:

  • 你打电话给a.func还是a.func1

标签: python python-2.x


【解决方案1】:
class A:
    @MyDecorator("Blablabla")
    def func1(self, arg1, arg2, arg3):
        print (arg1,arg2,arg3)

您需要将 self 参数添加到您的函数中。

【讨论】:

    【解决方案2】:

    如果您更喜欢在没有第一个 self 参数的情况下编写 func1 方法,则需要在装饰器中删除此参数:

    def __call__(self, func):
        def wrapped(obj, *args, **kwargs):
             # obj is just ignored
             print "in wrapper:"
             func(*args, **kwargs)
    

    这与使用@staticmethod 完全一样:调用a.func1 时,a 作为第一个参数传递,但此参数被装饰器删除。

    【讨论】:

    • 这是真的,但这不是导致 OP 出现错误的原因。
    • @AndrewSledge 两种解决方案都有效并修复了 OP 的错误,尽管使用您的代码肯定会更容易阅读。只有当你需要实现@staticmethod 行为时,我的才是有用的。
    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多