方法执行后提交 - 装饰器
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
我是装饰器的新手,我正在尝试创建一个,它会在方法执行后 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