欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的裝飾器用法學(xué)習(xí)筆記

 更新時間:2016年06月24日 18:19:05   作者:cangmean  
這篇文章主要介紹了Python的裝飾器用法學(xué)習(xí)筆記,裝飾器的使用是Python編程中的高級技巧,需要的朋友可以參考下

在python中常看到在定義函數(shù)是使用@func. 這就是裝飾器, 裝飾器是把一個函數(shù)作為參數(shù)的函數(shù),常常用于擴展已有函數(shù),即不改變當前函數(shù)狀態(tài)下增加功能.

def run():
  print "I'm run."

我有這么一個函數(shù), 我想知道這個函數(shù)什么時候開始什么時候結(jié)束. 我應(yīng)該這么寫

def run():
  print time.ctime()
  print "I'm run."
  print time.ctime()

但是如果不允許修改函數(shù)的話就需要裝飾器了

def count(func):
  def wrapper():
    print time.ctime()
    ret = func()
    print time.ctime()
    return ret
  return wrapper

@count
def run():
  print "I'm run."

      # print '2015-4-10'

eg:

def now():
  print '2015-4-10'
f = now
f()  

 

函數(shù)有一個__name__ 對象 可通過 dir(func) func為定義的函數(shù)名

now.__name__    # print 'now'
f.__name__     # print 'now'

print f       # print '<function now at 0x000000000213A908>'
print now      # print '<function now at 0x000000000213A908>'

我們通過裝飾器打印log日志

def log(func):
  def wrapper(*args, **kwargs):
    print "call %s()" % func.__name__
    return func(*args, **kwargs)
  return wrapper

@log
def now():
  print '2015-4-10'

now()        # print 'call now()'

其實裝飾器修飾函數(shù)相當于, now = log(now) 也就是裝飾器函數(shù)把被修飾的函數(shù)當參數(shù)后賦給同名的變量

functools.wraps 函數(shù)

當我們使用了裝飾器后now的__name__值發(fā)生了改變

# 沒有使用前
now.__name__    # print 'now'
# 使用后
now.__name__    # print 'wrapper'

當我們使用裝飾器前,now.__name__使用的是當前now函數(shù),但使用后 now這個函數(shù)其實是 log(now) 也就是log函數(shù)的返回值也就是被包裹的wrapper. 解決方法是functools.wraps函數(shù).

裝飾閉包, 使用前得調(diào)用 import functools

def log(func):
  @functools.wraps(func)
  def wrapper(*args, **kwargs):
    ...

帶參數(shù)的裝飾器

如果decorator需要傳入?yún)?shù), 那就需要在寫一個返回decorator的高階函數(shù). 寫出來更復(fù)雜.

def login(level):
  def _deco(func):
    def wrapper(*args, **kwargs):
      if level >= 5:
        print '用戶 VIP 等級 %d' % int(level-5)
      else:
        print '用戶 屌絲 等級 %d' % abs(level-5)
      return func(*args, **kwargs)
    return wrapper
  return _deco

@login(5)
def user(username):
  print 'welcome, %s' % username

# 用戶vip 等級0
# welcome, mink
user('mink')

帶參數(shù)的decorator等于func = 裝飾器函數(shù)(裝飾器參數(shù))(func)

裝飾器類

通過類的__call__可以想使用函數(shù)一樣使用類

class A(object):
  def __init__(self, func):
    self.func = func

  def __call__(self):
    return self.func() ** 2

@A
def foo():
  return 10

print foo()   # print 100

相關(guān)文章

  • 如何利用python給圖片添加半透明水印

    如何利用python給圖片添加半透明水印

    這篇文章主要給大家介紹了關(guān)于如何利用python給圖片添加半透明水印的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Jupyter Notebook切換conda虛擬環(huán)境的實現(xiàn)步驟

    Jupyter Notebook切換conda虛擬環(huán)境的實現(xiàn)步驟

    本文主要介紹了Jupyter Notebook切換conda虛擬環(huán)境的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • django中row語法詳解

    django中row語法詳解

    在Django模板中,使用{{ row }}語法可以輸出列表row的所有元素,但是如果你想要輸出列表中的某個元素,需要使用下標來訪問它,這篇文章主要介紹了django中row語法詳解,需要的朋友可以參考下
    2023-06-06
  • 快速實現(xiàn)基于Python的微信聊天機器人示例代碼

    快速實現(xiàn)基于Python的微信聊天機器人示例代碼

    本篇文章主要介紹了快速實現(xiàn)基于Python的微信聊天機器人示例代碼,基于itchat開發(fā),可以用它做一個微信聊天機器人,有興趣的可以了解一下。
    2017-03-03
  • python3實現(xiàn)公眾號每日定時發(fā)送日報和圖片

    python3實現(xiàn)公眾號每日定時發(fā)送日報和圖片

    這篇文章主要為大家詳細介紹了python3實現(xiàn)公眾號每日定時發(fā)送日報和圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python爬蟲通過替換http request header來欺騙瀏覽器實現(xiàn)登錄功能

    Python爬蟲通過替換http request header來欺騙瀏覽器實現(xiàn)登錄功能

    這篇文章主要介紹了Python爬蟲通過替換http request header來欺騙瀏覽器實現(xiàn)登錄功能,需要的朋友可以參考下
    2018-01-01
  • Python獲取當前時間的方法

    Python獲取當前時間的方法

    這篇文章主要介紹了Python獲取當前時間的方法,有需要的朋友可以參考一下
    2014-01-01
  • Python爬蟲包BeautifulSoup異常處理(二)

    Python爬蟲包BeautifulSoup異常處理(二)

    這篇文章主要為大家詳細介紹了Python爬蟲包BeautifulSoup的異常處理,具有一定的參考價值,感興趣的朋友可以參考一下
    2018-06-06
  • Python數(shù)據(jù)序列化之pickle模塊

    Python數(shù)據(jù)序列化之pickle模塊

    這篇文章主要介紹了Python數(shù)據(jù)序列化之pickle模塊,pickle的本質(zhì)是將Python數(shù)據(jù)還原為內(nèi)存中的二進制數(shù)據(jù),供用戶轉(zhuǎn)移、儲存,更多詳細內(nèi)容,需要的小伙伴可以下面文章內(nèi)容
    2022-03-03
  • pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例

    pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例

    本文主要介紹了pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論