函式物件有乙個__name__
屬性,可以拿到函式的名字:
>>> def now():
print('2017-6-15')
>>> f = now
>>> f()
2017-6-15
>>> f.__name__
'now'
>>> now.__name__
'now'
假設我們要增強now()
函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now()
函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)
decorator就是乙個返回函式的高階函式
def log(func):
print('call %s():' % func.__name__)
return func(*args, **kw)
要借助python的@語法,把decorator置於函式的定義處:
>>> @logdef now():
print('2017-06-15')
呼叫now()
函式,不僅會執行now()
函式本身,還會在執行now()
函式前列印一行日誌:
>>> now()
call now():
2017-06-15
把@log
放到now()
函式的定義處,相當於執行了語句:
now = log(now)
如果decorator本身需要傳入引數,那就需要編寫乙個返回decorator的高階函式,寫出來會更複雜。比如,要自定義log的文字
def log(text):
def decorator(func):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return decorator
@log('execute')
def now():
print('2015-3-25')
結果:
>>> now()
execute now():
2015-3-25
效果等同於
>>> now = log('execute')(now)
>>> now.__name__
import functoolsdef log(func):
@functools.wraps(func)
print('call %s():' % func.__name__)
return func(*args, **kw)
import functoolsdef log(text):
def decorator(func):
@functools.wraps(func)
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return decorator
偏函式
簡單總結functools.partial
的作用就是,把乙個函式的某些引數給固定住(也就是設定預設值),返回乙個新的函式,呼叫這個新函式會更簡單。
pyhotn3入門基礎 12 迭代器
可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinstance iterable true i...
pyhotn3入門基礎 資料型別和變數
1.字串 print i m ok.i m ok.print i m learning npython.i m learning python.print n 轉義 print t print r t t 列印多行 print line1 line2 line3 line1 line2 line3 ...
python 基礎裝飾器入門
1 裝飾器語法糖 python提供了 符號作為裝飾器的語法糖,使我們更方便的應用裝飾函式。但使用語法糖要求裝飾函式必須return乙個函式物件。因此我們將上面的func函式使用內嵌函式包裹並return。裝飾器相當於執行了裝飾函式use loggin後又返回被裝飾函式bar,因此bar 被呼叫的時候...