標籤:python 模式 裝飾器
在瞭解裝飾器的之前一定要先瞭解函數作為參數傳遞, 什麼是函數內嵌,請參考我之前寫的部落格函數簡介
python裝飾器思想有點類似設計模式的裝飾模式, 其意圖是動態地給函數對象添加額外的功能.比如像增加日誌列印的功能,有點面向切面編程(AOP)的感覺.
裝飾器文法
以@開頭,接著後面跟著的是裝飾器的名字和可選的參數.裝飾器文法是一種文法糖.
格式如下
@decomaker(deco_args) def foo(func_opt_args)
可以組合,等價於foo = g(f(foo))
@g@fdef foo(): statement
簡單裝飾器
執行個體
#!/usr/bin/pythondef deco(func): print ‘start‘ func() print ‘end‘ return func@decodef foo(): print ‘In foo‘foo()foo()
輸出
startIn fooendIn fooIn foo
帶內嵌函數裝飾器
內嵌函數保證每次新函數都被調用
執行個體
def deco(func): def _deco(): #該函數為內嵌函數 print ‘start‘ func() print ‘end‘ return _deco@decodef foo(): print ‘In foo‘foo()foo()
輸出:
startIn fooendstartIn fooend
帶參數的裝飾器
需要自己返回以函數作為參數的裝飾器。換句話說,decomaker()用 deco_args 做了些事並返回
函數對象,而該函數對象正是以 foo 作為其參數的裝飾器。簡單的說來:foo = decomaker(deco_args)(foo)
執行個體
def deco(arg): def wrapper(func): def _deco(x): print "get param is: ", x func(x) return _deco return wrapper @deco("type1")def foo(x): print ‘In foo‘foo(123)
輸出
get param is: 123In foo
python裝飾器簡介