最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在python中??吹皆诙x函數(shù)是使用@func. 這就是裝飾器, 裝飾器是把一個(gè)函數(shù)作為參數(shù)的函數(shù),常常用于擴(kuò)展已有函數(shù),即不改變當(dāng)前函數(shù)狀態(tài)下增加功能.

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

我有這么一個(gè)函數(shù), 我想知道這個(gè)函數(shù)什么時(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ù)有一個(gè)__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í)裝飾器修飾函數(shù)相當(dāng)于, now = log(now) 也就是裝飾器函數(shù)把被修飾的函數(shù)當(dāng)參數(shù)后賦給同名的變量

functools.wraps 函數(shù)

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

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

當(dāng)我們使用裝飾器前,now.__name__使用的是當(dāng)前now函數(shù),但使用后 now這個(gè)函數(shù)其實(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ù), 那就需要在寫一個(gè)返回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)文章

最新評論

东阿县| 云林县| 民丰县| 锡林郭勒盟| 玛多县| 峡江县| 祁连县| 宁安市| 阳新县| 韶关市| 新宁县| 甘孜县| 马边| 土默特左旗| 孝昌县| 崇左市| 洱源县| 泸水县| 高州市| 长沙县| 丰县| 大港区| 武定县| 洱源县| 周宁县| 永康市| 闵行区| 沁阳市| 常山县| 和林格尔县| 涞源县| 临澧县| 阳原县| 南宁市| 搜索| 黄冈市| 囊谦县| 泰州市| 武宣县| 吐鲁番市| 淳化县|