翻譯:陳之炎 校對:趙茹萱 函數(shù)裝飾器有事半功倍的力量。 Wallhaven 提供 圖片 “簡勝于繁,?!?/span> Python函數(shù)裝飾器是“Python zen”哲學(xué)的最佳特性。 裝飾器助力用更少,、更簡單的代碼來實現(xiàn)復(fù)雜的邏輯,,并在其他地方實現(xiàn)重用。 有許多很棒的內(nèi)置Python裝飾器使編碼變得更為容易,,只使用一行代碼便可向當(dāng)前的函數(shù)或類中添加復(fù)雜的函數(shù),。 行勝于言,接下來,,來看看精心挑選的9個函數(shù)裝飾器,,它將展示Python的優(yōu)雅。 1. @lru_cache:利用緩存提速程序使用@lru_cache裝飾器是提速Python函數(shù)最簡易的方法,。 此裝飾器將函數(shù)的結(jié)果放入緩存,,供后續(xù)具有相同參數(shù)的函數(shù)調(diào)用,無需再次執(zhí)行具有相同參數(shù)的函數(shù),。 對于那些算力成本高昂或常用相同參數(shù)函數(shù)的調(diào)用特別有用,。 來看看以下直觀的示例: 上述程序用Python函數(shù)計算第n個Fibonacci數(shù),這個函數(shù)非常耗時,,當(dāng)計算fibonacci(30)時,,在遞歸過程中需要多次計算先前的Fibonacci數(shù)。 用@lru_cache裝飾器來對它進(jìn)行提速: 正如上述代碼所示,,使用@lru_cache裝飾器后,,可以在0.00002990秒內(nèi)得到相同的結(jié)果,,比先前的0.18129450秒快了不少。 @lru_cache裝飾器有一個“最多結(jié)果數(shù)目”參數(shù),,該參數(shù)指定要在緩存中存儲的最大結(jié)果數(shù)目,。當(dāng)緩存已滿且需要存儲新結(jié)果時,會將最近使用得最少的結(jié)果從緩存中刪除,,為新緩存騰出空間,,稱之為最近最不常用策略(LRU)。 默認(rèn)情況下,,將“最多結(jié)果數(shù)目”設(shè)為128,。如果設(shè)為None,則禁用 LRU特性,,緩存可以無約束地增長,。 2. @total_ordering: 填充缺失排序方法的類裝飾器函數(shù)工具模塊中的@total_sordeng裝飾器為預(yù)定義Python類生成缺失比較方法。 下面為示例程序: 如上述代碼所示,,在學(xué)生類中沒有對__ge__,、__gt__和__le__方法進(jìn)行定義,多虧有了@total_order裝飾器,,不同實例之間的比較結(jié)果均正確,。 該裝飾器的好處顯而易見:
3. @contextmanager:定制的語境管理器Python有一個語境管理器機(jī)制助力正確地管理資源。 大多數(shù)情況下,,只需要使用with聲明: 如上述代碼所示,,可以使用with語句打開文件,在寫入之后將自動關(guān)閉,。無需顯式地調(diào)用f.close()函數(shù)來關(guān)閉該文件,。 有時,,需要為某些特定需求定義一個自定義的語境管理器,,此時,@contextmanager裝飾器便成為了我們的朋友,。 例如,,下述代碼實現(xiàn)了一個簡單的自定義語境管理器,它可以在文件打開或關(guān)閉時打印出相應(yīng)的信息,。 4. @property: 為Python類設(shè)置處理程序和設(shè)置程序Getters和Setters是面向?qū)ο缶幊蹋∣OP)中的重要概念,。 對于類中的每個實例變量,,getter方法返回其值,而setter方法設(shè)置或更新其值,。鑒于此,,Getters和Setters又分別稱為Accessors和Mutators。 它們用于保護(hù)數(shù)據(jù)不會直接被意外訪問或修改,。 不同的OOP語言有不同的機(jī)制來定義獲取器getters和setters,。在Python中,可以簡單地使用@property裝飾器,。 如上述示例所示,,無法將分?jǐn)?shù)變量設(shè)置為999,這是一個毫無意義的數(shù)字,。因為@property裝飾器的設(shè)置函數(shù)中限制了分?jǐn)?shù)的可接受范圍,。 毫無疑問,添加這個setter可以成功地避免意外的錯誤和結(jié)果,。 5. @cached_property:將方法的結(jié)果作為屬性放入緩存Python 3.8的函數(shù)工具模塊引入了一個新的功能強(qiáng)大的裝飾器-@cached_property,,它將類的方法轉(zhuǎn)換為一個屬性,計算出該屬性的值之后,,將其作為實例的普通屬性放入緩存,。 下面是這個示例: 在上述代碼中,利用@cached_property來裝飾局部方法,,無需重復(fù)計算circle.area示例,。 6. @classmethod:定義新的Python類方法Python類中有三種方法類型:
可以將實例方法定義成普通的Python函數(shù),,它的第一個參數(shù)是自身,;如果需要定義一個類方法,則需要使用@classmethod裝飾器,。 為了演示,,下面的示例定義了一個類方法,可以用它來根據(jù)直徑獲得一個圓: 7. @staticmethod:為Python類定義靜態(tài)方法如前所述,,靜態(tài)方法不綁定到實例或類,,僅僅因為它們在邏輯上屬于那個類,,才被包含進(jìn)來。 靜態(tài)方法通常用于執(zhí)行一組相關(guān)任務(wù)的實用程序類中,,如數(shù)學(xué)計算,。通過將相關(guān)函數(shù)組織成類的靜態(tài)方法,使代碼變得更加有組織,、更容易理解,。 使用@staticmethod裝飾器便可以定義一個靜態(tài)方法,來看看下面這個例子: 8. @dataclass:用更少的代碼定義專用類@dataclass裝飾器(在Python3.7中引入)可以自動為一個類生成幾種專用的方法,,如__init__,、__repr__、__eq__,、__lt__等,。 因此,它可以節(jié)省大量編寫這些基本方法的時間,。如果一個類主要用于存儲數(shù)據(jù),,那么@dataccass裝飾器是最好的朋友。 為了進(jìn)行演示,,下面的示例只定義了一個名為Point類的兩個數(shù)據(jù)字段,,@dataclass裝飾器就夠用了: 9. @atexit.register:注冊一個程序正常終止的函數(shù)atexit模塊的@register裝飾器允許在Python解釋器退出時執(zhí)行一個函數(shù)。 該裝飾器對于執(zhí)行最終的任務(wù)非常有用,,比如釋放資源或說“再會”,!?? 下面是這個示例: 輸出如下: 如示例所示,由于使用了@register裝飾器,,即使沒有明確地調(diào)用“再會”函數(shù),,終端也打印出了“再會!”,。 感謝拔冗閱讀,。?? 原文鏈接:https:///techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017 譯者簡介 陳之炎,北京交通大學(xué)通信與控制工程專業(yè)畢業(yè),,獲得工學(xué)碩士學(xué)位,,歷任長城計算機(jī)軟件與系統(tǒng)公司工程師,大唐微電子公司工程師,,現(xiàn)任北京吾譯超群科技有限公司技術(shù)支持,。目前從事智能化翻譯教學(xué)系統(tǒng)的運營和維護(hù),在人工智能深度學(xué)習(xí)和自然語言處理(NLP)方面積累有一定的經(jīng)驗,。業(yè)余時間喜愛翻譯創(chuàng)作,,翻譯作品主要有:IEC-ISO 7816、伊拉克石油工程項目,、新財稅主義宣言等等,,其中中譯英作品“新財稅主義宣言”在GLOBAL TIMES正式發(fā)表。能夠利用業(yè)余時間加入到THU 數(shù)據(jù)派平臺的翻譯志愿者小組,,希望能和大家一起交流分享,,共同進(jìn)步 翻譯組招募信息 工作內(nèi)容:需要一顆細(xì)致的心,將選取好的外文文章翻譯成流暢的中文,。如果你是數(shù)據(jù)科學(xué)/統(tǒng)計學(xué)/計算機(jī)類的留學(xué)生,,或在海外從事相關(guān)工作,或?qū)ψ约和庹Z水平有信心的朋友歡迎加入翻譯小組,。 你能得到:定期的翻譯培訓(xùn)提高志愿者的翻譯水平,,提高對于數(shù)據(jù)科學(xué)前沿的認(rèn)知,海外的朋友可以和國內(nèi)技術(shù)應(yīng)用發(fā)展保持聯(lián)系,,THU數(shù)據(jù)派產(chǎn)學(xué)研的背景為志愿者帶來好的發(fā)展機(jī)遇,。 其他福利:來自于名企的數(shù)據(jù)科學(xué)工作者,北大清華以及海外等名校學(xué)生他們都將成為你在翻譯小組的伙伴,。 |
|