国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

Python中用Decorator來簡化元編程的教程

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:32:33
文檔

Python中用Decorator來簡化元編程的教程

Python中用Decorator來簡化元編程的教程:少勞多得 Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實(shí)現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實(shí)現(xiàn) P
推薦度:
導(dǎo)讀Python中用Decorator來簡化元編程的教程:少勞多得 Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實(shí)現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實(shí)現(xiàn) P

少勞多得

Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實(shí)現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實(shí)現(xiàn) Python 類的創(chuàng)建,而不需要使用 “元類” 掛鉤。

Decorator 根本上的平庸與之非常類似。Decorator 所實(shí)現(xiàn)的功能就是修改緊接 Decorator 之后定義的函數(shù)和方法。這總是可能的,但這種功能主要是由 Python 2.2 中引入的 classmethod() 和 staticmethod() 內(nèi)置函數(shù)驅(qū)動(dòng)的。在舊式風(fēng)格中,您可以調(diào)用 classmethod(),如下所示:
清單 1. 典型的 “舊式” classmethod

class C:
 def foo(cls, y):
 print "classmethod", cls, y
 foo = classmethod(foo)

雖然 classmethod() 是內(nèi)置函數(shù),但并無獨(dú)特之處;您也可以使用自己的方法轉(zhuǎn)換函數(shù)。例如:
清單 2. 典型的 “舊式” 方法的轉(zhuǎn)換

def enhanced(meth):
 def new(self, y):
 print "I am enhanced"
 return meth(self, y)
 return new
class C:
 def bar(self, x):
 print "some method says:", x
 bar = enhanced(bar)

decorator 所做的一切就是使您避免重復(fù)使用方法名,并且將 decorator 放在方法定義中第一處提及其名稱的地方。例如:
清單 3. 典型的 “舊式” classmethod

class C:
 @classmethod
 def foo(cls, y):
 print "classmethod", cls, y
 @enhanced
 def bar(self, x):
 print "some method says:", x

decorator 也可以用于正則函數(shù),采用的是與類中的方法相同的方式。令人驚奇的是,這一切是如此簡單(嚴(yán)格來說,甚至有些不必要),只需要對(duì)語法進(jìn)行簡單修改,所有東西就可以工作得更好,并且使得程序的論證更加輕松。通過在方法定義的函數(shù)之前列出多個(gè) decorator,即可將 decorator 鏈接在一起;良好的判斷可以有助于防止將過多 decorator 鏈接在一起,不過有時(shí)候?qū)讉€(gè) decorator 鏈接在一起是有意義的:
清單 4. 鏈接 decorator

@synchronized
@logging
def myfunc(arg1, arg2, ...):
 # ...do something
# decorators are equivalent to ending with:
# myfunc = synchronized(logging(myfunc))
# Nested in that declaration order

Decorator 只是一個(gè)語法糖,如果您過于急切,那么它就會(huì)使您搬起石頭砸了自己的腳。decorator 其實(shí)就是一個(gè)至少具有一個(gè)參數(shù)的函數(shù) —— 程序員要負(fù)責(zé)確保 decorator 的返回內(nèi)容仍然是一個(gè)有意義的函數(shù)或方法,并且實(shí)現(xiàn)了原函數(shù)為使連接有用而做的事情。例如,下面就是 decorator 兩個(gè)不正確的用法:
清單 5. 沒有返回函數(shù)的錯(cuò)誤 decorator

>>> def spamdef(fn):
... print "spam, spam, spam"
...
>>> @spamdef
... def useful(a, b):
... print a**2 + b**2
...
spam, spam, spam
>>> useful(3, 4)
Traceback (most recent call last):
 File "", line 1, in ?
TypeError: 'NoneType' object is not callable

decorator 可能會(huì)返回一個(gè)函數(shù),但這個(gè)函數(shù)與未修飾的函數(shù)之間不存在有意義的關(guān)聯(lián):
清單 6. 忽略傳入函數(shù)的 decorator

>>> def spamrun(fn):
... def sayspam(*args):
... print "spam, spam, spam"
... return sayspam
...
>>> @spamrun
... def useful(a, b):
... print a**2 + b**2
...
>>> useful(3,4)
spam, spam, spam

最后,一個(gè)表現(xiàn)更良好的 decorator 可以在某些方面增強(qiáng)或修改未修飾函數(shù)的操作:
清單 7. 修改未修飾函數(shù)行為的 decorator

>>> def addspam(fn):
... def new(*args):
... print "spam, spam, spam"
... return fn(*args)
... return new
...
>>> @addspam
... def useful(a, b):
... print a**2 + b**2
...
>>> useful(3,4)
spam, spam, spam
25

您可能會(huì)質(zhì)疑,useful() 到底有多么有用?addspam() 真的是那樣出色的增強(qiáng) 嗎?但這種機(jī)制至少符合您通常能在有用的 decorator 中看到的那種模式。

高級(jí)抽象簡介

根據(jù)我的經(jīng)驗(yàn),元類應(yīng)用最多的場(chǎng)合就是在類實(shí)例化之后對(duì)類中的方法進(jìn)行修改。decorator 目前并不允許您修改類實(shí)例化本身,但是它們可以修改依附于類的方法。這并不能讓您在實(shí)例化過程中動(dòng)態(tài)添加或刪除方法或類屬性,但是它讓這些方法可以在運(yùn)行時(shí)根據(jù)環(huán)境的條件來變更其行為。現(xiàn)在從技術(shù)上來說,decorator 是在運(yùn)行 class 語句時(shí)應(yīng)用的,對(duì)于頂級(jí)類來說,它更接近于 “編譯時(shí)” 而非 “運(yùn)行時(shí)”。但是安排 decorator 的運(yùn)行時(shí)決策與創(chuàng)建類工廠一樣簡單。例如:
清單 8. 健壯但卻深度嵌套的 decorator

def arg_sayer(what):
 def what_sayer(meth):
 def new(self, *args, **kws):
 print what
 return meth(self, *args, **kws)
 return new
 return what_sayer

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Python中用Decorator來簡化元編程的教程

Python中用Decorator來簡化元編程的教程:少勞多得 Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實(shí)現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實(shí)現(xiàn) P
推薦度:
標(biāo)簽: python pytho pyt
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美性xxxbbb | 亚洲一区二区久久 | 91在线 | 欧美: | 在线免费黄色网址 | 天堂va欧美ⅴa亚洲va一国产 | 国产成人无精品久久久久国语 | 国产精品永久免费自在线观看 | 欧美1区2区3区 | 久久久久久国产精品免费 | 欧美日韩国产在线观看 | 亲子交尾五十路 | 国产资源网站 | 国产va在线播放 | 欧美日韩网址 | 国产一区在线免费观看 | 毛片1级 | 亚洲图片欧美日韩 | 免费成人毛片 | 久久久国产麻豆 | 国产欧美久久久精品影院 | 国产黄色免费看 | 艹久久| 国产欧美一区二区三区精品 | 亚洲欧美一区二区三区九九九 | 99久久国产综合精品成人影院 | 草湿影院| 日韩精品一区二区三区四区 | 亚韩在线 | 精品伊人久久久 | 极品久久| 久久香蕉国产线看观看乱码 | 欧美成人高清视频 | 亚洲 欧美 中文 日韩欧美 | 国产一区二区成人 | 福利一区三区 | 国产成人99久久亚洲综合精品 | 国产女上位 | 亚洲欧美自拍一区 | 国产人成精品综合欧美成人 | 成人爽a毛片在线视频 | 亚洲午夜久久久久久久久电影网 |