python裝飾器

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)  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章