美文网首页
python中装饰器的装饰顺序和执行顺序

python中装饰器的装饰顺序和执行顺序

作者: 飞翔之雄鹰 | 来源:发表于2018-07-21 12:18 被阅读0次

在python语言中“装饰器”模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用‘@’符号加装饰器名就能达到目的。但如果同一个目标函数需要进行多次装饰,那么调用目标函数时装饰器的执行顺序是怎样的呢?

这里有个例子,有个目标函数叫lunch,中午调用一下来决定午饭吃什么

# coding: utf-8
import random

# 饭馆
restaurants = {
    'KFC': ['hamburger', 'chicken wings', 'ice cream', 'salmon fish'],
    'xiapu': ['Beef hotpot', 'Mutton hotpot', 'Tomato hotpot'],
}

def chose_food(f):
    print 'decorator: chose_food enter'
    def func(*args, **kwargs):
        print 'decorator: chose_food::func enter'
        a_rstrnt = args[0]
        food = random.choice(restaurants[a_rstrnt])
        return f(food, *args, **kwargs)

    print 'decorator: chose_food exit'
    return func

def restaurant(f):
    print 'decorator: restaurant enter'
    def func(*args, **kwargs):
        print 'decorator: restaurant::func enter'
        a_rstrnt = random.choice(restaurants.keys())
        return f(a_rstrnt, *args, **kwargs)

    print 'decorator: restaurant exit'
    return func

@restaurant
@chose_food
def lunch(food, addr, then):
    print "We're going to {} for '{}', then {}".format(addr, food, then)

lunch('have a rest')

输出结果

decorator: chose_food enter
decorator: chose_food exit
decorator: restaurant enter
decorator: restaurant exit
decorator: restaurant::func enter
decorator: chose_food::func enter
We're going to KFC for 'hamburger', then have a rest

通过打印结果可以看出装饰器装饰的顺序是“从下到上”依次执行,而执行的顺序是“从上到下”。

原因是装饰器在这个例子中起的作用是对目标函数包装,两个装饰器装饰过后,是这种情形:

lunch(then){} = deco.restaurant(then) { 
                    deco:chose_food(rstrnt, then) { 
                        lunch(food, rstrnt, then){} 
                    }
                }

lunch(then)被调用时自然按照由外到内的顺序执行。

相关文章

  • 多个装饰器存在时的执行顺序

    装饰器的执行顺序是怎样的? 装饰器函数的执行顺序分为定义阶段和执行阶段,装饰器函数在被装饰函数定义好后立即执行 在...

  • python中装饰器的装饰顺序和执行顺序

    在python语言中“装饰器”模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用‘@...

  • Python 装饰器执行顺序迷思

    探究多个装饰器执行顺序 装饰器是Python用于封装...

  • python 装饰器执行顺序

    先上代码和效果 输出: 执行步骤详解: 定义阶段 定义wrapper_a 定义wrapper_b 进入wrappe...

  • Day05

    一、装饰器进阶 多个装饰器同时装饰一个函数,执行顺序是由上往下执行被装饰函数执行之前的操作,再执行被装饰函数,最后...

  • Python 入门之多个装饰器执行顺序

    装饰器是 Python 用于封装函数或代码的工具,网上可以搜到很多文章可以学习,在这里要讨论的是多个装饰器执行顺序...

  • 装饰器5

    装饰器嵌套 语法糖执行顺序def fun_a(func): print("装饰器fun_a")def funct...

  • 装饰器的执行顺序!!!

    https://www.cnblogs.com/guodengjian/articles/9134944.html

  • 关于python多重装饰器的执行顺序

    装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序。...

  • 13. Python之装饰器

    1 什么是装饰器 2 为何要用装饰器 3 如何使用装饰器 4 语法糖 5 叠加多个装饰器,加载顺序与运行顺序 6 ...

网友评论

      本文标题:python中装饰器的装饰顺序和执行顺序

      本文链接:https://www.haomeiwen.com/subject/bbkhmftx.html