所謂裝飾器就是把函數(shù)包裝一下,為函數(shù)添加一些附加功能,裝飾器就是一個(gè)函數(shù),參數(shù)為被包裝的函數(shù),返回包裝后的函數(shù):你可以試下:
創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元衡陽(yáng)縣做網(wǎng)站,已為上家服務(wù),為衡陽(yáng)縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def d(fp):
def _d(*arg, **karg):
print "do sth before fp.."
r= fp(*arg, **karg)
print "do sth after fp.."
return r
return _d
@d
def f():
print "call f"
#上面使用@d來(lái)表示裝飾器和下面是一個(gè)意思
#f = d(f)
f()#調(diào)用f
追問:
如果裝飾器和被裝飾的函數(shù)還有其他參數(shù)呢?
追答:
裝飾器帶參數(shù):再包裝一層
被裝飾的函數(shù)還有其他參數(shù):上面的例子包裝函數(shù)就是接收任意形式的參數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: cp936 -*-
def d(a):
def _d(fp):
def __d(*arg, **karg):
print a
print "do sth before fp.."
r= fp(*arg, **karg)
print "do sth after fp.."
return r
return __d
return _d
@d("haha")
def f():
print "call f"
@d("hehe")
def f2(a, b=2):
print "call f2"
print a+b
f()
print "-"*20
f2(1)
print "-"*20
f2(a=1,b=4)
一、指代不同
1、Python IDLE:是Python的集成開發(fā)環(huán)境?,自1.5.2b1以來(lái)已與該語(yǔ)言的默認(rèn)實(shí)現(xiàn)捆綁在一起。
2、python:是一種跨平臺(tái)的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。是一種面向?qū)ο蟮膭?dòng)態(tài)類型語(yǔ)言。
二、用處不同
1、Python IDLE:被打包為Python包裝的可選部分,包含許多Linux發(fā)行版 。 完全用Python和Tkinter?GUI工具包編寫(?Tcl?/ Tk的?包裝函數(shù))。
2、python:被設(shè)計(jì)用于編寫自動(dòng)化腳本(shell),隨著版本的不斷更新和語(yǔ)言新功能的添加,越來(lái)越多被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。
三、特點(diǎn)不同
1、Python IDLE:是開發(fā) python 程序的基本IDE(集成開發(fā)環(huán)境),具備基本的IDE的功能,是非商業(yè)Python開發(fā)的不錯(cuò)的選擇。
2、python:在執(zhí)行時(shí),首先會(huì)將.py文件中的源代碼編譯成Python的byte code(字節(jié)碼),然后再由Python Virtual Machine(Python虛擬機(jī))來(lái)執(zhí)行這些編譯好的byte code。這種機(jī)制的基本思想跟Java,.NET是一致的。
參考資料來(lái)源:百度百科-Python
參考資料來(lái)源:百度百科-Idle
注意:這種發(fā)方法并不是裝飾器最常用的功能,但是在降低代碼重復(fù)上可謂是首屈一指。比如:如果不使用裝飾器,上述代碼可能會(huì)很多:
當(dāng)然,這里也有一個(gè)潛在的風(fēng)險(xiǎn),就是當(dāng)裝飾器包裹的函數(shù)已經(jīng)用了debug作為參數(shù)名,那么裝飾器這里將會(huì)報(bào)錯(cuò),所以要添加額外的一些判斷來(lái)完善代碼:
最后還剩下一部分比較難理解的地方,我將理解的注釋在每行代碼上方,這個(gè)問題就是,在打印被修飾函數(shù)的參數(shù)簽名時(shí),其實(shí)并不能正確顯示參數(shù)簽名,原因是因?yàn)楸粀rapper修飾過(guò)后的函數(shù)實(shí)際上應(yīng)該使用的是wrapper的參數(shù)簽名表,例如:
所以,接下來(lái),完成最后最難的一步: