在方法执行后提交 - 装饰器

时间:2015-07-31 10:33:57

标签: python wrapper decorator

我是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参数放在那里,但仍然出现错误。

你知道问题出在哪里吗?

3 个答案:

答案 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