错误:Decorator只需要2个参数(给定1个)

时间:2015-03-25 19:41:24

标签: python decorator

我正在尝试制作一个小装饰器,在数据库中更改后刷新gui。问题是我仍然遇到错误。当函数和装饰器不是某个类的一部分时,它可以工作。

class Tasks_Handling_Class:

    def database_changed(self,func):
        func()
        self.refresh_tasks_attribute()

    @database_changed
    def add_task(self,name,desc,time_minutes):
        try:
            self.msq.insert_into_table('tasks',name,desc,time_minutes)
            self.refresh_tasks_attribute()
            return True
        except Exception as e:
            print e
            return False

TypeError: database_changed() takes exactly 2 arguments (1 given)

我唯一想做的就是在self.refresh_tasks_attribute()方法之后运行add_task()方法。

你能提出一些建议吗?

1 个答案:

答案 0 :(得分:2)

装饰器将函数作为参数并返回一个新函数。这是一个非常简单的例子:

def noisy(func):
    def new_func(*args, **kwargs):
        print "hiyyyoooo!"
        func(*args, **kwargs)
    return new_func

您可以通过将其称为普通函数来定义已经定义的函数:

myfunc_noisy = noisy(myfunc)

或者您可以使用@语法,但仅限于函数的定义:

@noisy
def myfunc():
    print "hi"

在你的情况下,如果你只想在调用修饰函数后调用refresh_tasks_attribute(),那么你真的应该考虑你经常这样做的频率,因为手动调用可能更容易它。如果您仍想使用装饰器,它看起来像这样:

def database_changed(func):
    def new_func(*args, **kwargs):
        self = args[0]
        return_val = func(*args, **kwargs)
        self.refresh_tasks_attribute()
        return return_val
    return new_func