我是decorator中的新手,我正在尝试创建一个,在执行该方法后执行self.commit()
。
我的参数有问题。方法commit(decorator)在类中。
def commit(func):
def func_wrapper(func):
func()
self.commit()
return func_wrapper
我做了一个测试方法:
@commit
def h(self):
pass
并称之为:
db = database()
db.create_tables()
db.h()
错误:TypeError: commit() takes exactly 2 arguments (1 given)
我知道错误正在引发,因为它不是静态方法,所以我试图将self
参数放在那里,但仍然出现错误。
你知道问题出在哪里吗?
答案 0 :(得分:1)
您可以使用与函数相同的方式为方法构建装饰器,但需要考虑包装函数{/ 1} :
self
更新
更好的方法是使装饰器对函数和方法有用。这可以通过将def commit(func):
def func_wrapper(self):
func(self)
self.commit()
return func_wrapper
和*args
作为包装器的参数来完成,因此它可以接受任意数量的参数和关键字参数。
希望这会有所帮助:)
答案 1 :(得分:1)
您需要将实际参数传递给包装函数,并使用该参数调用修饰函数:
def commit(func):
def func_wrapper(self):
func(self)
self.commit()
return func_wrapper
答案 2 :(得分:1)
你需要传递函数的参数,正如之前的帖子所说。但是你很可能不希望限制你的函数在装饰器中使用的参数,为此使用Assuming Color Struct - 4 bytes per each color
//Prefill with color information
Color[] image1;
Color[] image2;
Color[] composedImage;
//For individual color components. Just normal blend equation.
composedImage[i].r = (1-image2[i].a) * image1[i].r + image2[i].a * image2[i].r;
composedImage[i].g = (1-image2[i].a) * image1[i].g + image2[i].a * image2[i].g;
composedImage[i].b = (1-image2[i].a) * image1[i].b + image2[i].a * image2[i].b;
//For final alpha
composedImage[_i].a = image1[_i].a + image2[_i].a * (1 -_image1[_i].a); //This is just by observation.
,*args
。最后,使用functools.wraps保留原始功能元数据是个好主意。
完整示例:
**kwargs