python-17-裝飾器造成固定模型

前言

裝飾器可能有點陌生,可是裝飾器它也是由函數而組成,那它有什麼做用呢?app

其實就是:不想修改函數的調用方式,但可在原來的函數先後添加功能。開放封閉原則:函數

  • 對擴展是開放的
  • 對修改是封閉的

1、裝飾器初成

一、仍是這個例子,定義兩個函數,func、timmer,簡單來講 func 是執行所需的時間,timmer 是來計算傳入的參數執行時長。spa

二、能夠看到timmer函數裏面有一個被裝飾的函數。既是 func 傳入 timmer。code

# 1.裝飾器初成
import time
def func():
    time.sleep(1)
    print('我在等待一秒鐘')

def timmer(f):                  # 裝飾器函數
    def inner():
        start = time.time()
        f()                      # 被裝飾函數
        end = time.time()
        print(end-start)
    return inner                # 別加 () 調用函數了,應傳內部函數名字

ff = timmer(func)
ff()

三、運行步驟以下圖blog

 2、裝飾器使用

一、裝飾器函數 timmerclass

二、被裝飾函數 func,直接@裝飾器函數,執行順序如上圖所示。import

# 2.裝飾器使用
import time
def timmer(f): 
    def inner():
        start = time.time()
        ret = f()
        end = time.time()
        return end-start, ret
    return inner  

@timmer         # @裝飾器函數名
def func():     # 被裝飾的函數
    time.sleep(1)
    return '我在等待一秒鐘'
print(func())

 3、萬能參數裝飾器

一、萬能傳參,其實就是用咱們前面所學的函數傳參方法,*args 和 **kwargs擴展

# 3.萬能參數裝飾器
import time
def timmer(f): 
    def inner(*args, **kwargs):     # *args, **kwargs 萬能接收參數
        start = time.time()
        ret = f(*args, **kwargs)     # *args, **kwargs 萬能傳入參數
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer
def func(a, b): 
    print(a, b)
    time.sleep(1)
    return '我在等待一秒鐘'

@timmer         
def func1(a):   
    print(a)
    time.sleep(1)
    return '我在等待一秒鐘'

print(func(1, 2))
print(func1(1))

4、裝飾器固定模式

一、裝飾器這樣咱們就能夠遊刃有餘的寫:在被裝飾函數之 前 、後 要作的功能了。方法

二、固定模式以下:im

# 4.裝飾器固定模式
def wrapper(f):                     # 裝飾器函數:wrapper   被裝飾函數:f
    def inner(*args, **kwargs):     # 被裝飾函數:inner == f
        # 在被裝飾函數之 前 要作的功能
        ret = f(*args, **kwargs)
        # 在被裝飾函數之 後 要作的功能
        return ret
    return inner

@wrapper        # @裝飾器函數,實際至關於:wrapper(fon)
def fon(a):
    print('打醬油')
    return a

r = fon('固定模式就是這樣')          # 實際至關於調用:inner
print(r)

 

有沒有裝飾器都不會影響原函數的執行,只是可以對現有的進行 先後 擴展,是否是頗有必要掌握好的技能呢?

若有更多歡迎來QQ交流羣:482713805

相關文章
相關標籤/搜索