1. 程式人生 > >Python基礎知識之裝飾器

Python基礎知識之裝飾器

                      裝飾器

 https://www.cnblogs.com/EVA-J/articles/7194277.html

1. 裝飾器的形成過程

2.裝飾器的作用

3.語法糖

原則: 開放封閉原則

----------------------------------------------------------------------------------------------------------------------------------------------------------------

固定模式:裝飾器固定模式

===========================================================================================

1.

 

import  time

def func():
    time.sleep(0.01)
    print("大家好")



def timer(f):
    start = time.time()
    f()
    end = time.time()
    print(end-start)

timer(func)

解讀這段程式碼 !

  首先 ,我們定義一個函式 func為例實現 leader交給我的功能! ok ,這個func函式假裝已經完成我們想要的功能 。

  現在 我們想要在func函式的基礎上增加  計算程式執行時間的功能,引入time 模組 ,通過 time.time()獲取當前時間

  這樣 ,我們的func函式可以這樣寫

  def func():
    start = time.time() # 程式執行前時間

    print("大家好,才是真的好!")  # 這裡假裝是我們的業務邏輯程式碼,想象這有很多行好吧。

    end = time.time()  # 程式執行結束時間  

    print(end - start)   #  獲取時間差,就可以知道程式執行時間的長短了。

  這樣就是我們在函式原有的基礎上擴充套件的功能 !

  但是,違背了我們開發中的 開放-封閉原則!

  開放:對擴充套件是開放的

  封閉:對修改是封閉的

  不想修改函式的呼叫方式,但是還在原有的函式前後新增功能

  ----------------------------------------------------------------------------------

  那我們把 要增加功能的函式當作引數  

  增加一個裝飾器函式

  def timer(f):

    def inner()

      start = time.time()

      f()

      end = time.time()

      print(end-start)

    return inner

 

func  = timer()  # 這裡返回的是inner 相當於把inner的記憶體地址賦值給了func

func()  這裡實際執行的是 inner()   -----  最終獲取了  print(end-start)

ok, 這就是我們的裝飾器函式

timer就是一個裝飾器函式,只是對一個函式  有一些裝飾作用

 

 ===========================

 語法糖的概念

 就是讓程式碼更簡潔,像吃糖一樣開心 ~~哈哈

@timer  #裝飾器函式的函式名

 def func():

  pass      # 要貼著被裝飾的函式

 

這才是真正的 不改變函式呼叫方式

 

 裝飾帶引數函式的裝飾器

 

19.27  動態引數 !!!

*arg  **kwargs 能hold整個世界

 

 

 wrapper  裝飾器

 

 

www.cnblogs.com/eva-j/articles/7194277.html