python中的裝飾器詳解
在了解裝飾器的之前一定要先了解函數(shù)作為參數(shù)傳遞, 什么是函數(shù)內(nèi)嵌,請參考我之前寫的博客函數(shù)簡介
因?yàn)樵趐ython里面,函數(shù)也是對象,也可以作為參數(shù)進(jìn)行傳遞.python裝飾器本質(zhì)也是一種特殊函數(shù),它接收的參數(shù)是函數(shù)對象,然后動(dòng)態(tài)地函數(shù)參數(shù)添加額外的功能,而不用修改原有的函數(shù)對象.python裝飾器傳入的參數(shù)是函數(shù),返回的值也是函數(shù)!
python裝飾器思想有點(diǎn)類似設(shè)計(jì)模式的裝飾模式, 其意圖是動(dòng)態(tài)地給函數(shù)對象添加額外的功能.比如像增加日志打印的功能,有點(diǎn)面向切面編程(AOP)的感覺.
裝飾器語法
以@開頭,接著后面跟著的是裝飾器的名字和可選的參數(shù).裝飾器語法是一種語法糖.
格式如下
@decomaker(deco_args)
def foo(func_opt_args)
可以組合,等價(jià)于foo = g(f(foo))
@g
@f
def foo():
statement
簡單裝飾器
實(shí)例
#!/usr/bin/python
def deco(func):
print 'start'
func()
print 'end'
return func
@deco
def foo():
print 'In foo'
foo()
foo()
輸出
start
In foo
end
In foo
In foo
帶內(nèi)嵌函數(shù)裝飾器
內(nèi)嵌函數(shù)保證每次新函數(shù)都被調(diào)用.而且被裝飾的函數(shù)可以帶有參數(shù).
實(shí)例
def deco(func):
def _deco(x): #該函數(shù)為內(nèi)嵌函數(shù)
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
帶參數(shù)的裝飾器
需要自己返回以函數(shù)作為參數(shù)的裝飾器。換句話說,decomaker()用 deco_args 做了些事并返回函數(shù)對象,而該函數(shù)對象正是以 foo 作為其參數(shù)的裝飾器。簡單的說來:foo=decomaker(deco_args)(foo)
實(shí)例
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)
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
總結(jié)
裝飾器本質(zhì)是高階的函數(shù),可以裝飾其他函數(shù),增加被裝飾函數(shù)的功能,但不能覆蓋或改變被裝飾函數(shù)原有的行為.對于被裝飾的函數(shù)來說,裝飾器是透明的.裝飾器傳入?yún)?shù)為函數(shù),返回的函數(shù)是被裝飾的函數(shù).最后我們來實(shí)現(xiàn)給一個(gè)函數(shù)添加打印日志的功能,而不用改變這個(gè)函數(shù).
#!/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])
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
相關(guān)文章
利用Python將數(shù)值型特征進(jìn)行離散化操作的方法
今天小編就為大家分享一篇利用Python將數(shù)值型特征進(jìn)行離散化操作的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11利用Python將多張圖片合成視頻的實(shí)現(xiàn)
這篇文章主要介紹了利用Python將多張圖片合成視頻的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語句
這篇文章主要介紹了基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語句,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06在pytorch 中計(jì)算精度、回歸率、F1 score等指標(biāo)的實(shí)例
今天小編就為大家分享一篇在pytorch 中計(jì)算精度、回歸率、F1 score等指標(biāo)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01詳解Python中數(shù)據(jù)處理的方法總結(jié)及實(shí)現(xiàn)
數(shù)據(jù)增強(qiáng)作為前處理的關(guān)鍵步驟,在整個(gè)計(jì)算機(jī)視覺中有著具足輕重的地位。本文為大家總結(jié)了Python中數(shù)據(jù)處理的方法及實(shí)現(xiàn),需要的可以參考一下2022-09-09