我正在尝试制作一个小装饰器,在数据库中更改后刷新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()
方法。
你能提出一些建议吗?
答案 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