在了解裝飾器的之前一定要先了解函式作為引數傳遞, 什麼是函式內嵌,請參考我之前寫的部落格函式簡介
因為在python裡面,函式也是物件,也可以作為引數進行傳遞.python裝飾器本質也是一種特殊函式,它接收的引數是函式物件,然後動態地函式引數新增額外的功能,而不用修改原有的函式物件.python裝飾器傳入的引數是函式,返回的值也是函式!
python裝飾器思想有點類似設計模式的裝飾模式, 其意圖是動態地給函式物件新增額外的功能.比如像增加日誌列印的功能,有點面向切面程式設計(aop)的感覺.
裝飾器語法
以@開頭,接著後面跟著的是裝飾器的名字和可選的引數.裝飾器語法是一種語法糖.
格式如下
複製** **如下:
@decomaker(deco_args)
def foo(func_opt_args)
可以組合,等價於foo = g(f(foo))
複製** **如下:
@g@f
def foo():
statement
簡單裝飾器例項
複製** **如下:
#!/usr/bin/python
def deco(func):
print 'start'
func()
print 'end'
return func
@deco
def foo():
print 'in foo'
foo()
foo()
輸出複製程式設計客棧** **如下:
start
in foo
endin foo
in foo
帶內嵌函式裝飾器內嵌函式保證每次新函式都被呼叫.而且被裝飾的函式可以帶有引數.
例項複製** **如下:
def deco(func):
def ptbtvwg_deco(x): #該函式為內嵌函ptbtvwg數
print 'start'
func(x)
print 'end'
return _deco
@deco
def foo(x):
print 'in foo, get value is: %d' % x
foo(123456)
輸出:複製** **如下:
start
in foo, get value is: 123456
end帶引數的裝飾器需要自己返回以函式作為引數的裝飾器。換句話說,decomaker()用 deco_args 做了些事並返回函式物件,而該函式物件正是以 foo 作為其引數的裝飾器。簡單的說來:foo=decomaker(deco_args)(foo)
例項複製** **如下:
def deco(arg):
def wrapper1(func):
def _deco(x):
print "get type is: ", arg
func(x)
return _deco
def wrapper2(func):
def _deco(x):
func(x)
&nbptbtvwgsp; print "get type is: ", arg
return _deco
if arg == 'type1':
return wrapper1
else:
return wrapper2
@deco("type2")
def foo(x):
print 'in foo: ', x
foo(123)
輸出複製** **如下:
in foo: 123
get type is: type2
總結裝飾器本質是高階的函式,可以裝飾其他函式,增加被裝飾函式的功能,但不能覆蓋或改變被裝飾函式原有的行為.對於被裝飾的函式來說,裝飾器是透明的.裝飾器傳入引數為函式,返回的函式是被裝飾的函式.最後我們來實現給乙個函式新增列印日誌的功能,而不用改變這個函式.
複製** **如下:
#!/usr/bin/python
#coding=utf-8
import functools
def log(prefix, suffix):
def deco(func):
@functools.wraps(func)
def wrapper(*args, **kargs):
print '%s log start' % prefix
print('get a is: %s' % args[0])
print('get b is: %s' % args[1])
print('get c is: %s' % args[2])
tbtvwgp; print('get d is: %s' % kargs['d'])
print('get d is: %s' % kargs['f'])
func(*args, **kargs)
print '%s log end' % suffix
return wrapper
return deco
@log('logstart', 'logend')
def test(a, b, c, d, f):
print 'call func name is: %s' % test.__name__
test(1, 2, 3, d = 'dddd', f = 'ffff')
輸出:複製** **如下:
logstart log start
get a is: 1
get b is: 2
get c is: 3
get d is: dddd
get d is: ffff
call func name is: test
logend log end
本文標題: python中的裝飾器詳解
本文位址:
Python中的裝飾器詳解
1.裝飾器介紹 2.語法糖 3.裝飾器的應用 4.多個裝飾器的使用 1.裝飾器介紹 裝飾器就是對被裝飾的物件 類,函式 進行重構的,可以在不改變原來物件的情況下呼叫物件時執行重構的行為,在不改變原函式的基礎上,給函式增加功能。特點 把乙個函式當作引數,返回乙個替代版的函式,本質就是乙個返回函式的函式...
python裝飾器 python 裝飾器詳解
def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...
python裝飾器詳解 python裝飾器詳解
按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...