用class-decorator装饰类方法

时间:2013-12-26 15:50:41

标签: python python-2.x

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

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)

2 个答案:

答案 0 :(得分:2)

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

您需要在函数中添加self参数。

答案 1 :(得分:1)

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

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

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