方法执行后执行提交

2024-05-21 05:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我对decorators是新手,我正在尝试创建一个decorators,它在方法执行之后执行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参数放在那里,但是仍然出现了错误。你知道吗

你知道问题出在哪里吗?你知道吗


Tags: 方法selfdecoratorsdbreturndef错误decorator
3条回答

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

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

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

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

更新:

更好的方法是使decorator对函数方法有用。这可以通过将*args**kwargs作为包装器的参数来实现,这样它就可以接受任意数量的参数和关键字参数。你知道吗

希望这有帮助:)

您需要为函数传递参数,正如前面的帖子所说。但是您很可能不想限制函数在decorator中采用的参数,请使用*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

相关问题 更多 >