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

溫馨提示×

溫馨提示×

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

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

一些關于python 裝飾器的個人理解

發布時間:2020-10-18 19:52:45 來源:腳本之家 閱讀:184 作者:Wonz 欄目:開發技術

裝飾器

本質是一個接受參數為函數的函數。
作用:為一個已經實現的方法添加額外的通用功能,比如日志記錄、運行計時等。

舉例

1.不帶參數的裝飾器,不用@

# 不帶參數的裝飾器
def deco_test(func):
  def wrapper(*args, **kwargs):
    print("before function")
    f = func(*args, **kwargs)
    print("after function")
    return f
  return wrapper

def do_something(a,b,c):
  print(a)
  time.sleep(1)
  print(b)
  time.sleep(1)
  print(c)
  return a

if __name__ == '__main__':
  # 不用@
  f = deco_test(do_something)("1","2","3")

輸出:

before function
1
2
3
after function

個人理解:

相當于在 do_something 函數外面套了兩個輸出: before function 和 after function 。

2.不帶參數的裝飾器,用 @

# 不帶參數的裝飾器
def deco_test(func):
  def wrapper(*args, **kwargs):
    print("before function")
    f = func(*args, **kwargs)
    print("after function")
    return f
  return wrapper

@deco_test
def do_something(a,b,c):
  print(a)
  time.sleep(1)
  print(b)
  time.sleep(1)
  print(c)
  return a

if __name__ == '__main__':
  # 使用@
  f = do_something("1","2","3")

輸出:

before function
1
2
3
after function

個人理解:

相當于執行 do_something 函數的時候,因為有 @ 的原因,已經知道有一層裝飾器 deco_test ,所以不需要再單獨寫 deco_test(do_something) 了。

3.帶參數的裝飾器

# 帶參數的裝飾器
def logging(level):
  def wrapper(func):
    def inner_wrapper(*args, **kwargs):
      print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
      f = func(*args, **kwargs)
      print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
      return f
    return inner_wrapper
  return wrapper

@logging(level="debug")
def do_something(a,b,c):
  print(a)
  time.sleep(1)
  print(b)
  time.sleep(1)
  print(c)
  return a

if __name__ == '__main__':
  # 使用@
  f = do_something("1","2","3")

輸出:

[debug]: enter function do_something()
1
2
3
after function: [debug]: enter function do_something()

個人理解:

裝飾器帶了一個參數 level = "debug" 。

最外層的函數 logging() 接受參數并將它們作用在內部的裝飾器函數上面。內層的函數 wrapper() 接受一個函數作為參數,然后在函數上面放置一個裝飾器。這里的關鍵點是裝飾器是可以使用傳遞給 logging() 的參數的。

4.類裝飾器

# 類裝飾器
class deco_cls(object):
  def __init__(self, func):
    self._func = func

  def __call__(self, *args, **kwargs):
    print("class decorator before function")
    f = self._func(*args, **kwargs)
    print("class decorator after function")
    return f

@deco_cls
def do_something(a,b,c):
  print(a)
  time.sleep(1)
  print(b)
  time.sleep(1)
  print(c)
  return a

if __name__ == '__main__':
  # 使用@
  f = do_something("1","2","3")

輸出:

class decorator before function
1
2
3
class decorator after function

個人理解:

使用一個裝飾器去包裝函數,返回一個可調用的實例。 因此定義了一個類裝飾器。

5.兩層裝飾器

# 不帶參數的裝飾器
def deco_test(func):
  def wrapper(*args, **kwargs):
    print("before function")
    f = func(*args, **kwargs)
    print("after function")
    return f
  return wrapper

# 帶參數的裝飾器
def logging(level):
  def wrapper(func):
    def inner_wrapper(*args, **kwargs):
      print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
      f = func(*args, **kwargs)
      print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
      return f
    return inner_wrapper
  return wrapper

@logging(level="debug")
@deco_test
def do_something(a,b,c):
  print(a)
  time.sleep(1)
  print(b)
  time.sleep(1)
  print(c)
  return a

if __name__ == '__main__':
  # 使用@
  f = do_something("1","2","3")

輸出:

[debug]: enter function wrapper()
before function
1
2
3
after function
after function: [debug]: enter function wrapper()

個人理解:

在函數 do_something() 外面先套一層 deco_test() 裝飾器,再在最外面套一層 logging() 裝飾器。

以上就是python 裝飾器的一些個人理解的詳細內容,更多關于python 裝飾器的資料請關注億速云其它相關文章!

向AI問一下細節

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

AI

东丰县| 福安市| 成都市| 房产| 元氏县| 洛隆县| 南澳县| 冀州市| 井研县| 邢台县| 慈利县| 富平县| 明星| 福州市| 兴山县| 英吉沙县| 琼结县| 油尖旺区| 义马市| 航空| 安多县| 和林格尔县| 南康市| 景德镇市| 海门市| 响水县| 沈阳市| 且末县| 通海县| 资溪县| 长春市| 彝良县| 宜丰县| 庄浪县| 新野县| 武乡县| 什邡市| 城步| 焦作市| 台东县| 福建省|