如何在Python中实现两个装饰器,这两个装饰器最终都希望调用调用函数

如何在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将检

我试图通过使用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都希望最终执行调用方法(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