自學Python4.2-裝飾器

自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-djangohtml

自學Python4.2 - 裝飾器

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

1.簡單列子:  計算一段代碼的執行時間

代碼1:前端

import  time
print(time.time())
def func():  # 被裝飾的函數
    start = time.time()  # 獲取開始的時間
    print('我好喜歡你們啊 ~~')  # 測試時間的代碼
    end = time.time()
    print(end-start)
func()

代碼2:
因爲執行代碼的速度太快,沒有體現出來結果,這是可使用 time.sleep(10)  加大代碼執行的時間。python

import  time
print(time.time())
def func():  # 被裝飾的函數
    start = time.time()  # 獲取開始的時間
    print('我好喜歡你們啊 ~~')  # 測試時間的代碼
    time.sleep(0.01)
    end = time.time()
    print(end-start)
func()

代碼3: 數據庫

爲了讓函數func()徹底分離出來,如今定義一個新函數timmer(),主要用於計算函數的執行時間(開始的時間,結束時間,執行的函數)django

import  time
print(time.time())
def func():  # 被裝飾的函數
    time.sleep(0.01)
    print('我好喜歡你們啊 ~~')  # 測試時間的代碼
def timmer(func): #裝飾函數
    start = time.time()  # 獲取開始的時間
    func()
    end = time.time()
    print(end-start)

timmer(func)  #執行timmer,並且是執行參數func的函數 

代碼4:  裝飾器編程

其實上面的例子,真正環境下是存在問題的。     應該最終調用func(), 最好調用func()時候實質是調用timmer()緩存

  • 裝飾器的做用:不想修改函數的調用方式,可是還想再原來的函數先後添加功能
  • 裝飾器的開發原則:開放封閉原則
  • 裝飾器的本質:閉包函數
  • 以上例子timmer就是一個裝飾器函數,只是對一個函數有一些裝飾做用

函數的閉包定義:網絡

    在函數內部再定義一個函數,而且這個函數用到了外邊函數的變量,那麼將這個函數以及用到的一些變量稱之爲閉包。閉包

 

裝飾器本質上就是一個python閉包函數,他可讓其餘函數在不須要作任何代碼變更的前提下,增長額外的功能,裝飾器的返回值也是一個函數對象。併發

  裝飾器的應用場景:好比插入日誌,性能測試,事務處理,緩存等等場景。

import  time
print(time.time())
def func():
    time.sleep(0.01)
    print('我好喜歡你們啊 ~~')

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

2.編碼原則: 開放封閉原則

  • 開放:對擴展是開放的
  • 封閉:對修改是封閉的(封板)

3.裝飾器---語法糖

import  time
print(time.time())

def timmer(f):    #裝飾器函數
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    return inner
@timmer  #語法糖  @裝飾器的函數 ,至關於func = timmer(func)
def func(): #被裝飾的函數
    time.sleep(0.01)
    print('我好喜歡你們啊 ~~')

func()

相關文章
相關標籤/搜索