码迷,mamicode.com
首页 > 其他好文 > 详细

两个装饰器的执行顺序

时间:2018-11-19 21:34:21      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:time()   imp   str   程序   分享图片   bubuko   star   NPU   src   

两个装饰器的执行顺序

如下,两个装饰器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 = time.time()
        print(stop_time-start_time)
    return inner1

def auth_func(func2):
    print("auth")
    def inner2():
        print("from inner2")
        name = input("input your name:").strip()
        pwd = input("input your password:").strip()
        if name == user_name and pwd == user_pwd:
            print("login successful")
            func2()
        else:
            print("name or password error")
    return inner2
            
@time_func
@auth_func
def test():
    print("from test")    
test()

1.python解释器从上而下执行代码:导入时间模块,定义变量用户名和密码

2.遇到装饰器(闭包函数)time_func,申请了1片内存地址,函数名time_func指向了这片内存地址,程序继续向下执行(这里只是定义了函数,并不会执行,所以相当于1行代码)

3.遇到装饰器auth_func,这里同第2步,申请1片内存地址,函数名auth_func 指向这片内存地址,程序继续向下执行

4.解释器执行到装饰@time_func这里,此行代码下是一个装饰器@auth_func而不是一个函数,python解释器并不会执行装饰功能,程序继续向下执行

5.Python解释器执行到@auth_func,因为装饰的是一个函数test,定义test函数,申请一片内存地址,test指向它
技术分享图片

6.装饰器@auth_func 就相当于test = auth_func(test)

①执行等号左边代码:test赋值给func2即func2指向了test的内存地址

②auth_func():执行函数auth_func,定义了函数inner2,申请1片内存地址,函数名inner2指向这片内存地址(此处并未调用函数,故看成1行代码),继续向下执行,返回inner2

③test接收返回值inner2即test指向了inner2的内存地址
技术分享图片

7.装饰器@time_func执行,test = time_func(test),

①test赋值给func1即func1指向test的内存地址(此时test指向了inner2),故func1指向了inner2,

②定义了函数inner1,申请1片内存地址,函数名inner1指向这片内存地址(未调用函数,故看成1行代码),继续向下执行,返回inner1

③test接收返回值inner1,test指向了inner1的内存地址
技术分享图片

8.调用函数test(),执行test指向的内存地址代码即inner1,inner1中的func1指向了inner2,inner2中的func2指向了test

inner1()

inner2()

test()

运行结果 inner1,inner2

实际运行结果如下,先装饰了auth_func,后装饰了time_func,先执行了计时功能,后执行了验证功能(此处特地延缓输入的时间,如果是先执行的验证功能,此处耗时应该很短)

技术分享图片

倒个顺序装饰:耗时0.0s极快

总结:1.靠近函数的先装饰

? 2.先装饰的后执行

技术分享图片

两个装饰器的执行顺序

标签:time()   imp   str   程序   分享图片   bubuko   star   NPU   src   

原文地址:https://www.cnblogs.com/robert-zhou/p/9985479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!