【例】:

def dec1(func):
print("HHHA:0====>")
def one():
print("HHHA:0.1====>")
func()
print("HHHA:0.2====>")
return one def dec2(func):
print("HHHB:0====>")
def two():
print("HHHB:0.1====>")
func()
print("HHHB:0.2====>")
return two def dec3(func):
print("HHHC:0====>")
def three():
print("HHHC:0.1====>")
func()
print("HHHC:0.2====>")
return three @dec1
@dec2
@dec3
def test():
print("HHHD:0====>test") print("HHHH:0====>")
test()

输出:

HHHC:====>
HHHB:====>
HHHA:====>
HHHH:====>
HHHA:0.1====>
HHHB:0.1====>
HHHC:0.1====>
HHHD:====>test
HHHC:0.2====>
HHHB:0.2====>
HHHA:0.2====>

请注意:以HHHH:0====>为界,咋们要分开两部分:

第一部分:

语法糖部分

语法糖部分的执行顺序是从下到上(即从最靠近被装饰的函数开始)。

所以第一部分输出:

HHHC:0====>
    HHHB:0====>
    HHHA:0====>

第二部分:

加了装饰器的函数调用部分,因为语法糖部分的定义顺序是从下往上的,

所以最后执行test() = dec1(dec2(dec3(test)))()

所以第二部分输出:

HHHA:0.1====>
    HHHB:0.1====>
    HHHC:0.1====>
    HHHD:0====>test
    HHHC:0.2====>
    HHHB:0.2====>
    HHHA:0.2====>

输出语句流程图:

{
print("HHHA:0.1====>") //最外层
{
print("HHHB:0.1====>") //中间层
{
print("HHHC:0.1====>") //内层
{
test() //被装饰者
{
print("HHHD:0====>test")
}
}
print("HHHC:0.2====>")
}
print("HHHB:0.2====>")
}
print("HHHA:0.2====>")
}

被装饰的函数是一个妹子,装饰器是衣服。“办事情”的时候得依次把外套、衬衣、内衣脱掉,事情办完了还要依次把内衣、衬衣、外套穿上。距离“妹子”越近的装饰器代表越贴身的衣服。

python3-多装饰器的执行顺序的更多相关文章

  1. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  2. python多个装饰器的执行顺序

    def decorator_a(func): print 'Get in decorator_a' def inner_a(*args, **kwargs): print 'Get in inner_ ...

  3. typescript装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  4. TypeScript 装饰器的执行原理

    装饰器本质上提供了对被装饰对象 Property​ Descriptor 的操作,在运行时被调用. 因为对于同一对象来说,可同时运用多个装饰器,然后装饰器中又可对被装饰对象进行任意的修改甚至是替换掉实 ...

  5. (转)Python3.5——装饰器及应用详解

    原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...

  6. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...

  7. python 多个装饰器的调用顺序

    python 多个装饰器的调用顺序 一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器.多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则). 原代 ...

  8. python两个装饰器的运算顺序

    #装饰顺序按靠近函数顺序执行,调用时由外而内,执行顺序和装饰顺序相反. def makebold(func): def wrap(): return "<i>"+fun ...

  9. python3中装饰器的用法总结

    装饰器预备知识点 1 函数赋值给一个变量 函数名可以像普通变量一样赋值给另一个变量. def test(): print("i am just a test function") ...

随机推荐

  1. PubMed数据下载

    目标站点分析 目标:抓取页面中的机构名称,日期,标题,作者, 作者信息, 摘要 程序实现 # -*- coding: utf-8 -*- """ @Datetime: 2 ...

  2. flask blueprint

    在使用flask进行一个项目编写的时候,可能会有许多个模块,如一个网站的前台(home)和后台(admin)模块,如果把这两个模块都放在一个views.py文件之中,那么最后views.py文件必然臃 ...

  3. Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现!

    Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现! 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集群启动顺序 1>. ...

  4. 设计模式---数据结构模式之组合模式(Composite)

    前提:数据结构模式 常常有一些组建在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大的破坏组件的复用.这时候,将这些数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无 ...

  5. Shuttle 学习

    见  http://blog.csdn.net/liu765023051/article/details/38521039

  6. ARM寄存器介绍

    ARM处理器共有37个寄存器.其中包括:31个通用寄存器,包括程序计数器(PC)在内.这些寄存器都是32位寄存器.以及6个32位状态寄存器.但目前只使用了其中12位.ARM处理器共有7种不同的处理器模 ...

  7. HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6393 题意 给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路. 分析 n个点和n条边,实 ...

  8. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

  9. Linux 三剑客 -- awk sed grep

    本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...

  10. Python自定义分页组件

    为了防止XSS即跨站脚本攻击,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import admin from ...