python3-多装饰器的执行顺序

【例】:

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:0====>
HHHB:0====>
HHHA:0====>
HHHH:0====>
HHHA:0.1====>
HHHB:0.1====>
HHHC:0.1====>
HHHD:0====>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====>")
}

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

原文地址:https://www.cnblogs.com/Xuuuuuu/p/10244515.html

时间: 2024-11-07 15:11:23

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

两个装饰器的执行顺序

两个装饰器的执行顺序 如下,两个装饰器time_func 和auth_func分别实现了测试程序耗时和认证功能 import time user_name = "zb" user_pwd = "123" def time_func(func1): print("time") def inner1(): print("from inner1") start_time = time.time() func1() stop_time

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

python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inner1') ret = f1(*args,**kwargs) return ret return inner1 def wrapper2(f2): print('in wrapper2') def inner2(*args,**kwargs): print('in inner2') ret = f2

TypeScript 装饰器的执行原理

装饰器本质上提供了对被装饰对象 Property? Descriptor 的操作,在运行时被调用. 因为对于同一对象来说,可同时运用多个装饰器,然后装饰器中又可对被装饰对象进行任意的修改甚至是替换掉实现,直观感觉会有一些主观认知上的错觉,需要通过代码来验证一下. 比如,假若每个装饰器都对被装饰对象的有替换,其结果会怎样? 多个装饰器的应用 通过编译运行以下示例代码并查看其结果可以得到一些直观感受: function f() { console.log("f(): evaluated")

关于多个装饰器装饰一个函数执行顺序的问题

我们通过两个实例来解开我们的疑惑: 实例一: def war1(func): def inner(*args, **kwargs): print("======war1 start=====") func(*args, **kwargs) print("======war1 end=====") return inner def war2(func): def inner(*args,**kwargs): print("======war2 start==

python 多个装饰器的调用顺序

python 多个装饰器的调用顺序 一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器.多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则). 原代码 执行结果 装饰顺序 : 就近原则 被装饰的函数,组装装饰器时,是从下往上装饰 执行顺序 : 就远原则 装饰器调用时是从上往下调用 为了更好的理解,找到这段话: 被装饰的函数是一个妹子,装饰器是衣服."办事情"的时候得依次把外套.衬衣.内衣脱掉,事情办完了还要依次把内衣.衬衣.外套穿上.

Python3.5:装饰器的使用

在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... print('i an funA') ... time.sleep(1) >>> f = now >>> f() i am funA 函数对象有一个__name__属性,可以拿到函数的名字: >>> funA.__name__ 'funA' >>&

装饰器,装饰器多参数的使用(*arg, **kwargs),装饰器的调用顺序

一.#1.执行outer函数,并且将其下面的函数名,当作参数 #2.将outer的返回值重新赋值给f1 = outer的返回值 #3.新f1 = inner #4.func = 原f1 1 #!/usr/bin/env python 2 def outer(func) : 3 def inner() : 4 print("hello") 5 print("hello") 6 print("hello") 7 r = func() 8 print(

python3练习-装饰器

在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志.写出一个@log的decorator,使它既支持: @log def f(): pass 又支持: @log('execute') def f(): pass 示例代码(个人练习,如有问题欢迎斧正): # ! usr/bin/env python3 # -*- coding:utf-8 -

装饰器(执行原函数前后可以有些操作)常用于设置访问权限

1. 需要先知道的知识点 # python是从上到下执行的 def f1(): print(123) def f2(): print(456) #这是执行f1() 输出456 # 函数整体是可以当做参数进行传递的 def f1(): print('123') def f2(xxx): xxx() f2(f1) # f1未加括号,相当于f1这个函数整体 解释器功能: 1. 自动执行@函数,并将其下面的函数名当作参数传递 2. 将@函数的返回值,重新赋值给下面的函数 在多层装饰器的情况下: 解释->