亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python 語法之裝飾器

發布時間:2020-08-15 18:42:07 來源:ITPUB博客 閱讀:176 作者:ckxllf 欄目:編程語言

  裝飾器的概念

  裝飾器是 Python 的一個重要部分。簡單地說:就是用于拓展原來函數功能的一種函數,目的是在不改變原函數名(或類名)的情況下,給函數增加新的功能。

  這個函數的特殊之處在于它的返回值也是一個函數,這個函數是內嵌 “原” 函數的函數。

  將函數作為參數傳給另一個函數

  def yanzheng():

  return "--- 正在驗證 ---"

  def login(func):

  print(func())

  print("--- 正在登陸 ---")

  login(yanzheng)

  運行結果:

  --- 正在驗證 ---

  --- 正在登陸 ---

  寫代碼要遵循開放封閉原則,雖然在這個原則是用的面向對象開發,但是也適用于函數式編程,簡單來說,它規定已經實現的功能代碼不允許被修改,但可以被擴展,即:

  封閉:已實現的功能代碼塊

  開放:對擴展開發

  現在你已經具備所有必需知識,接下來進一步學習什么是真正的裝飾器。

  你的第一個裝飾器

  def func_out(func):

  def func_in():

  print("--- 正在驗證 ---")

  func()

  return func_in

  @func_out

  def login():

  print("--- 正在登陸 ---")

  login()

  運行結果:

  --- 正在驗證 ---

  --- 正在登陸 ---

  @函數名稱 是 Python 的一種語法糖。簡而言之,語法糖就是程序語言中提供[奇技淫巧]的一種手段和方式而已。 通過這類方式編寫出來的代碼,即好看又好用,好似糖一般的語法。固美其名曰:語法糖

  裝飾器下面正好是個函數,則默認執行:login = func_out(login)

  裝飾器的流程圖

  

  裝飾有返回值的函數

  上面的案例,被裝飾的 login() 函數并沒有返回值,那么接下來咱們看看有返回值的函數如何裝飾。

  首先,先看第一個案例:

  def func_out(func):

  def func_in():

  print("--- 正在驗證 ---")

  func()

  return func_in

  @func_out

  def login():

  return "--- 正在登陸 ---"

  result = login()

  print(result)

  運行結果:

  --- 正在驗證 ---

  None

  思考一下,為什么我調用 login() 函數,并且使用 result 變量來接收返回值,為什么結果是 None 呢?

  如果想不明白,就看看第二個案例:

  def func_out(func):

  def func_in():

  print("--- 正在驗證 ---")

  data = func()

  return data

  return func_in

  @func_out

  def login():

  return "--- 正在登陸 ---"

  result = login()

  print(result)

  運行結果:

  --- 正在驗證 ---

  --- 正在登陸 ---

  大家仔細觀察代碼,這兩個案例有哪些不同?

  發現了嗎?我在 func_in() 函數的里面多寫了兩句代碼:

  1、當我們調用被裝飾的 login() 函數時,實際執行的是 func_in() 函數的代碼,此時會調用 print() 函數打印 "--- 正在驗證 ---"。 鄭州人流醫院 http://rl.zyfuke.com/

  2、代碼執行到 data = func() 時,會先執行右側的 func() 函數,而這個函數是原始的 login() 函數,所以會 return 返回一個值,此時這個值被等號左側的 data 變量接收。

  3、代碼執行到 return data,此時會將 data 值返回更上一層,而這個值被 result 變量接收。

  4、最終打印 result 變量就輸出了原始 login() 函數的值。

  在這里最需要注意的就是 return 返回數據,只能返回一層函數,多層時,就需要在上層同時使用 return。

  裝飾有參數的函數

  demo1:

  def func_out(func):

  def func_in():

  func()

  return func_in

  def login(a):

  prin

  print(a)

  login(10)

  運行結果:

  10

  demo2:

  def func_out(func):

  def func_in():

  func()

  return func_in

  @func_out

  def login(a):

  print(a)

  login(10)

  運行結果:

  TypeError: func_in() takes 0 positional arguments but 1 was given

  類型錯誤:func_in()接受0個位置參數,但給出了1個

  demo3:

  def func_out(func):

  def func_in(data):

  func(data)

  return func_in

  @func_out

  def login(a):

  print(a)

  login(10)

  運行結果:

  10

  demo4:

  def func_out(func):

  def func_in(*args,**kwargs):

  func(*args,**kwargs)

  return func_in

  @func_out

  def login(*args,**kwargs):

  print(args)

  print(kwargs)

  login(10,20,c=1,b=2)

  運行結果:

  (10, 20)

  {'c': 1, 'b': 2}

  總結

  裝飾器函數只有一個參數就是被裝飾的函數的引用

  裝飾器能夠將一個函數的功能在不修改代碼的情況下進行擴展

  在函數定義的上方@裝飾器函數名 即可直接使用裝飾器對下面的函數進行裝飾

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭锦旗| 汝州市| 丹江口市| 那坡县| 遵义县| 历史| 泸西县| 济宁市| 灵宝市| 禹城市| 久治县| 岳西县| 六枝特区| 铁岭市| 榆林市| 大石桥市| 桐梓县| 乌兰察布市| 海盐县| 仙桃市| 惠来县| 垫江县| 海丰县| 林芝县| 崇州市| 措勤县| 绵竹市| 平潭县| 东丽区| 贵定县| 上思县| 晋州市| 江源县| 区。| 信阳市| 会宁县| 福泉市| 天镇县| 广昌县| 雅江县| 游戏|