1.装饰器的使用:

import time
def dec(func):
    def wrapper():
        start_time=time.time()
        func()
        end_time=time.time()
        print('程序运行时间为:',end_time-start_time)
    return wrapper

@dec #等于func=dec(func)
def func():
    print('hello')
    time.sleep(1)
    print('world')

func()
>>:
hello
world
程序运行时间为: 1.0015339851379395
-----执行过程-----
1.定义dec(func)
2.@dec 等于执行func=dec(func)
    2.1运行dec(func)内部
        2.1.1定义wrapper()
    2.2返回wrapper,此时func=wrapper
3.执行func() 此时fun()=wrapper()
4.执行wrapper()内部
    4.1start_time=time.time()取得开始时间start_time
    4.2执行func()
        4.2.1执行func()内部
            print('hello')
            time.sleep(1)
            print('world')
        4.2.2end_time=time.time()取得结束时间end_time
        4.2.3print('程序运行时间为:',end_time-start_time) 

2.带多个参数的装饰器

import time
def dec(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs)
        end_time=time.time()
        print('程序运行时间为:',end_time-start_time)
    return wrapper
@dec
def func1(a,b):
    print('第一个参数为%s'%a)
    time.sleep(1)
    print('第二个参数为%s'%b)
@dec
def func2(a,b,c):
    print('第一个参数为%s' % a)
    time.sleep(1)
    print('第二个参数为%s' % b)
    time.sleep(1)
    print('第三个参数为%s' % c)

func1('a','b')
func2('a','b','c')
>>:
第一个参数为a
第二个参数为b
程序运行时间为: 1.0039470195770264
第一个参数为a
第二个参数为b
第三个参数为c
程序运行时间为: 2.0091400146484375

3.多个装饰器

import time

def dec1(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        print('第一个装饰器开始')
        func(*args,**kwargs)
        end_time=time.time()
        print('第一个装饰器结束')
        print('程序运行时间为:',end_time-start_time)
    return wrapper
def dec2(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        print('第二个装饰器开始')
        func(*args,**kwargs)
        end_time=time.time()
        print('第二个装饰器结束')
        print('程序运行时间为:',end_time-start_time)
    return wrapper
@dec1#func=dec1(func)
@dec2#func=dec2(func)
def func(a,b):
    print('第一个参数为%s'%a)
    time.sleep(1)
    print('第二个参数为%s'%b)

func('a','b')
>>:
第一个装饰器开始
第二个装饰器开始
第一个参数为a
第二个参数为b
第二个装饰器结束
程序运行时间为: 1.0015060901641846
第一个装饰器结束
程序运行时间为: 1.0016918182373047
执行过程
1.定义第一个装饰器dec1(func)
2.定义第二个装饰器dec2(func)
3.执行@dec1 相当于func=dec1(func)
4.执行@dec2 相当于func=dec2(func)
5.执行dec2(func)内部
    5.1执行wrapper(*args,**kwargs)
    5.2返回wrapper,此时func=wrapper
6.执行dec1(func)内部
    6.1执行wrapper(*args,**kwargs)
    6.2返回wrapper,此时func=wrapper
        
7.执行func()相当于wrapper()(此时在装饰器dec1内)
    7.1执行start_time=time.time()
       print('第一个装饰器开始')
    7.2执行func(*args,**kwargs),此时跳转执行装饰器dec2中的wrapper
        7.2.1start_time=time.time()
             print('第二个装饰器开始')
        7.2.2执行func(*args,**kwargs)
             执行func(a,b):
             print('第一个参数为%s'%a)
             time.sleep(1)
             print('第二个参数为%s'%b)
    7.3 end_time=time.time()
        print('第二个装饰器结束')
        print('程序运行时间为:',end_time-start_time)   
    7.4 end_time=time.time()
        print('第一个装饰器结束')
        print('程序运行时间为:',end_time-start_time)