方法执行后提交 - 装饰器

Do commit after method execution - decorator

我是装饰器的新手,我正在尝试创建一个,它会在方法执行后 self.commit()

我对参数有疑问。提交方法(装饰器)在 class.

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 参数,但仍然出现错误。

你知道问题出在哪里吗?

您为方法构建装饰器的方式与为函数构建装饰器的方式相同,但是您需要将 self 考虑到包装函数:

def commit(func):
    def func_wrapper(self):
        func(self)
        self.commit()
    return func_wrapper

更新:

更好的方法是使装饰器对函数方法有用。这可以通过将 *args**kwargs 作为包装器的参数来完成,因此它可以接受 任意 数量的参数和关键字参数。

希望这对您有所帮助:)

您需要将实际参数传递给包装函数并使用该参数调用装饰函数:

def commit(func):
    def func_wrapper(self):
        func(self)
        self.commit()
    return func_wrapper

正如之前的帖子所说,您需要为函数传递参数。但是您很可能不想限制函数在装饰器中接受的参数,为此使用 *args**kwargs。最后,使用 functools.wraps 来保留原始函数元数据是个好主意。

完整示例:

from functools import wraps

def commit(func):
    @wraps(func)
    def wrapper(self, *args, **kwargs):
        func(self, *args, **kwargs)
        self.commit()
    return wrapper