1.語(yǔ)法糖
上面這段代碼看起來(lái)似乎已經(jīng)不能再精簡(jiǎn)了,Python于是提供了一個(gè)語(yǔ)法糖來(lái)降低字符輸入量。
importtime
deftimeit(func):
defwrapper():
start=time.clock()
func()
end=time.clock()
print'used:',end-start
returnwrapper
@timeit
deffoo():
print'infoo()'
foo()
重點(diǎn)關(guān)注第11行的@timeit,在定義上加上這一行與另外寫(xiě)foo=timeit(foo)完全等價(jià),千萬(wàn)不要以為@有另外的魔力。除了字符輸入少了一些,還有一個(gè)額外的好處:這樣看上去更有裝飾器的感覺(jué)。
2.內(nèi)置的裝飾器
內(nèi)置的裝飾器有三個(gè),分別是staticmethod、classmethod和property,作用分別是把類(lèi)中定義的實(shí)例方法變成靜態(tài)方法、類(lèi)方法和類(lèi)屬性。由于模塊里可以定義函數(shù),所以靜態(tài)方法和類(lèi)方法的用處并不是太多,除非你想要完全的面向?qū)ο缶幊?。而屬性也不是不可或缺的,Java沒(méi)有屬性也一樣活得很滋潤(rùn)。從我個(gè)人的Python經(jīng)驗(yàn)來(lái)看,我沒(méi)有使用過(guò)property,使用staticmethod和classmethod的頻率也非常低。
classRabbit(object):
def__init__(self,name):
self._name=name
@staticmethod
defnewRabbit(name):
@classmethod
defnewRabbit2(cls):
returnRabbit('')
@property
defname(self):
returnself._name
這里定義的屬性是一個(gè)只讀屬性,如果需要可寫(xiě),則需要再定義一個(gè)setter:
@name.setter
defname(self,name):
self._name=name
3.functools模塊
functools模塊提供了兩個(gè)裝飾器。這個(gè)模塊是Python2.5后新增的,一般來(lái)說(shuō)大家用的應(yīng)該都高于這個(gè)版本。但我平時(shí)的工作環(huán)境是2.4T-T
3.1.wraps(wrapped[,assigned][,updated]):
這是一個(gè)很有用的裝飾器??催^(guò)前一篇反射的朋友應(yīng)該知道,函數(shù)是有幾個(gè)特殊屬性比如函數(shù)名,在被裝飾后,上例中的函數(shù)名foo會(huì)變成包裝函數(shù)的名字wrapper,如果你希望使用反射,可能會(huì)導(dǎo)致意外的結(jié)果。這個(gè)裝飾器可以解決這個(gè)問(wèn)題,它能將裝飾過(guò)的函數(shù)的特殊屬性保留。
importtime
importfunctools
deftimeit(func):
@functools.wraps(func)
defwrapper():
start=time.clock()
func()
end=time.clock()
print'used:',end-start
returnwrapper
@timeit
deffoo():
print'infoo()'
foo()
printfoo.__name__
首先注意第5行,如果注釋這一行,foo.__name__將是'wrapper'。另外相信你也注意到了,這個(gè)裝飾器竟然帶有一個(gè)參數(shù)。實(shí)際上,他還有另外兩個(gè)可選的參數(shù),assigned中的屬性名將使用賦值的方式替換,而updated中的屬性名將使用update的方式合并,你可以通過(guò)查看functools的源代碼獲得它們的默認(rèn)值。對(duì)于這個(gè)裝飾器,相當(dāng)于wrapper=functools.wraps(func)(wrapper)。
3.2.total_ordering(cls):
這個(gè)裝飾器在特定的場(chǎng)合有一定用處,但是它是在Python2.7后新增的。它的作用是為實(shí)現(xiàn)了至少__lt__、__le__、__gt__、__ge__其中一個(gè)的類(lèi)加上其他的比較方法,這是一個(gè)類(lèi)裝飾器。如果覺(jué)得不好理解,不妨仔細(xì)看看這個(gè)裝飾器的源代碼:
53deftotal_ordering(cls):
54"""Classdecoratorthatfillsinmissingorderingmethods"""
55convert={
56'__lt__':[('__gt__',lambdaself,other:other 57('__le__',lambdaself,other:notother 58('__ge__',lambdaself,other:notself 59'__le__':[('__ge__',lambdaself,other:other<=self), 60('__lt__',lambdaself,other:notother<=self), 61('__gt__',lambdaself,other:notself<=other)], 62'__gt__':[('__lt__',lambdaself,other:other>self), 63('__ge__',lambdaself,other:notother>self), 64('__le__',lambdaself,other:notself>other)], 65'__ge__':[('__le__',lambdaself,other:other>=self), 66('__gt__',lambdaself,other:notother>=self), 67('__lt__',lambdaself,other:notself>=other)] 68} 69roots=set(dir(cls))&set(convert) 70ifnotroots: 71raiseValueError('mustdefineatleastoneorderingoperation:<><=>=') 72root=max(roots)#prefer__lt__to__le__to__gt__to__ge__ 73foropname,opfuncinconvert[root]: 74ifopnamenotinroots: 75opfunc.__name__=opname 76opfunc.__doc__=getattr(int,opname).__doc__ 77setattr(cls,opname,opfunc) 78returncls 以上內(nèi)容為大家介紹了Python的額外支持,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。