如何在Python中实现两个装饰器,这两个装饰器最终都希望调用调用函数
我试图通过使用Python装饰器简化我的Web应用程序处理程序 本质上,我想使用decorator抽象代码,检查经过身份验证的会话,另一个检查缓存提供程序(本例中为Memcache)是否有合适的响应 请考虑使用装饰器的此方法定义:如何在Python中实现两个装饰器,这两个装饰器最终都希望调用调用函数,python,design-patterns,decorator,Python,Design Patterns,Decorator,我试图通过使用Python装饰器简化我的Web应用程序处理程序 本质上,我想使用decorator抽象代码,检查经过身份验证的会话,另一个检查缓存提供程序(本例中为Memcache)是否有合适的响应 请考虑使用装饰器的此方法定义: @auth.login_required @cache.clear def post(self, facility_type_id = None): auth.login\u required检查用户是否已登录,否则返回相应的错误消息,或执行原始函数 clear将检
@auth.login_required
@cache.clear
def post(self, facility_type_id = None):
auth.login\u required检查用户是否已登录,否则返回相应的错误消息,或执行原始函数
clear将检查缓存是否具有特定的键,并在执行调用方法之前删除该键
auth.login_required和cache.clear都希望最终执行调用方法(post)
从我所读到的两个方面来看,我现在所做的将执行调用方法(post)两次
我的问题是,如何链接最终执行调用方法的装饰器,但确保只调用一次
感谢您的指点,感谢您抽出时间。您不了解装饰师是如何工作的
这两个装饰器已经“排序”。外部的一个将作为功能接收,以作用于一个已经装饰好的功能。内部函数不会被调用两次。您不了解装饰器是如何工作的
这两个装饰器已经“排序”。外部的一个将作为功能接收,以作用于一个已经装饰好的功能。内部函数不会被调用两次。每个后续的装饰器都会收到先前包装的函数,因此函数本身只会在链的末尾被调用一次。下面是一个简单的例子:
def dec1(f):
def wrapped():
print 'dec1'
return f()
return wrapped
def dec2(f):
def wrapped():
print 'dec2'
return f()
return wrapped
@dec2
@dec1
def spam(): print 'spam'
>>> spam()
dec2
dec1
spam
每个后续的装饰器都会收到先前包装的函数,因此函数本身只在链的末尾被调用一次。下面是一个简单的例子:
def dec1(f):
def wrapped():
print 'dec1'
return f()
return wrapped
def dec2(f):
def wrapped():
print 'dec2'
return f()
return wrapped
@dec2
@dec1
def spam(): print 'spam'
>>> spam()
dec2
dec1
spam