1. 程式人生 > >Python_裝飾器_29

Python_裝飾器_29

nbsp 當前 das wrap alt code ash outer turn

技術分享圖片

# 裝飾器形成的過程 : 最簡單的裝飾器 有返回值的 有一個參數 萬能參數
# 裝飾器的作用
# 原則 :開放封閉原則
# 語法糖 :@
# 裝飾器的固定模式



import time
# print(time.time()) # 獲取當前時間
# time.sleep(10)  #讓程序在執行到這個位置的時候停一會兒


def timmer(f):
    start = time.time()
    f()
    end = time.time()
    print(end - start)
    
def func():
    time.sleep(
0.01) print(大家好!) timmer(func) #fun()

裝飾器:

import time

def func():     #被裝飾的函數
    time.sleep(0.01)
    print(老板好同事好大家好)

def timmer(f):  # 裝飾器函數
    def inner():
        start = time.time()
        ret = f()  # 被裝飾的函數
        end = time.time()
        print(end - start)
        
return ret return inner func = timmer(func) func()

接受被裝飾的函數的返回值

import time

def timmer(f):    #裝飾器函數
    def inner():
        start = time.time()
        ret = f()       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret # 接受被裝飾的函數的返回值    不能直接return f()
return inner @timmer #語法糖 @裝飾器函數名 def func(): #被裝飾的函數 time.sleep(0.01) print(老板好同事好大家好) return 新年好 # func = timmer(func) # 語法糖 取代這條 ret = func() #inner() print(ret) # 裝飾器的作用 —— 不想修改函數的調用方式 但是還想在原來的函數前後添加功能 # timmer就是一個裝飾器函數,只是對一個函數 有一些裝飾作用 # 原則: 開放封閉原則 # 開放 : 對擴展是開放的 # 封閉 : 對修改是封閉的 # 封版

# def outer():
#     def inner():
#         return ‘inner‘
#     inner()
#
# outer()

裝飾帶參數函數的裝飾器

#裝飾帶參數函數的裝飾器
import time

def timmer(f):    #裝飾器函數
    def inner(*args,**kwargs):
        #(1,2) /(1)
        start = time.time()
        ret = f(*args,**kwargs)  #f(1,2)       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #語法糖 @裝飾器函數名
def func(a,b):     #被裝飾的函數
    time.sleep(0.01)
    print(老板好同事好大家好,a,b)
    return 新年好

@timmer         #語法糖 @裝飾器函數名
def func1(a):     #被裝飾的函數
    time.sleep(0.01)
    print(老板好同事好大家好,a)
    return 新年好
# func = timmer(func)
ret = func(1,2)   #inner()
ret = func(a=1,b=2)   #inner()
ret = func(1,b=2)   #inner()
ret = func(b=1,a=2)   #inner()
print(ret)

裝飾器模板:

def wrapper(f):    #裝飾器函數,f是被裝飾的函數
    def inner(*args,**kwargs):
        ‘‘‘在被裝飾函數之前要做的事‘‘‘
        ret = f(*args,**kwargs)    #被裝飾的函數
        ‘‘‘在被裝飾函數之後要做的事‘‘‘
        return ret
    return inner

@wrapper         #語法糖 @裝飾器函數名
def func(a,b):     #被裝飾的函數
    time.sleep(0.01)
    print(老板好同事好大家好,a,b)
    return 新年好

def wrapper():
    def inner():
        pass
    return inner

def wrapper(func):   #qqxing
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)   #被裝飾的函數
        return ret
    return inner

@wrapper        #qqxing = wrapper(qqxing)
def qqxing():
    print(123)

ret = qqxing()   #inner

Python_裝飾器_29