PEP原文 : https://www.python.org/dev/peps/pep-3129html
PEP標題: Class Decoratorspython
PEP做者: Collin Wintergit
建立日期: 2007-05-01github
合入版本: 3.0函數
譯者 :豌豆花下貓(Python貓 公衆號做者)ui
PEP翻譯計劃 :https://github.com/chinesehuazhou/peps-cn翻譯
本 PEP 提議推出類裝飾器,它是對 PEP-318 引入的函數與方法(function and method)裝飾器的擴展。設計
當初討論函數裝飾器是否該在 Python 2.4 中引入時,因爲有元類,因此類裝飾器被視爲晦澀且沒必要要的[1]。可是,在使用 Python 2.4.x 系列發行版本的幾年後,對函數裝飾器及其使用的日益熟悉以後,BDFL 和社區從新評估了類裝飾器,並建議將其包含在 Python 3.0 中[2]。code
這個改變的目的是使某些構造更易於表達,而且減小對 CPython 解釋器的實現細節的依賴。儘管可使用元類來實現相似裝飾器(decorator-like)功能的類,但結果一般使人不快,實現起來也很脆弱[3]。另外,元類是要繼承的,而類裝飾器則不是,這使得元類不適合類裝飾器的某些特定於類的使用場景。諸如 Zope 之類的大型 Python 項目正在經歷這些瘋狂的扭曲,就爲了取得類裝飾器能作到的成績,這一點反而使 BDFL 青睞上了類裝飾器。htm
類裝飾器的語義和設計目標與函數裝飾器的語義和設計目標相同([4],[5]); 惟一的區別是它在裝飾類而不是函數。 如下兩個片斷在語義上是相同的:
class A: pass A = foo(bar(A)) @foo @bar class A: pass
有關裝飾器的詳細解釋,請查閱 PEP-318。
調整 Python 的語法以支持類修飾符,須要修改兩個規則並添加一個新規則:
funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef
須要變成這樣:
decorated: decorators (classdef | funcdef) funcdef: 'def' NAME parameters ['->' test] ':' suite compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
添加 decorated 是必要的,以免語法出現含糊。 必須相應地修改 Python AST 和字節碼。 Jack Diederich 提供了參考實現[6]。
在發佈此 PEP 以後,幾乎沒有討論,這意味着每一個人都以爲應該接受它。
補丁已提交給 Subversion,版本爲 55430。
[1] http://www.python.org/dev/peps/pep-0318/#motivation
[2] https://mail.python.org/pipermail/python-dev/2006-March/062942.html
[3] https://mail.python.org/pipermail/python-dev/2006-March/062888.html
[4] http://www.python.org/dev/peps/pep-0318/#current-syntax
[5] http://www.python.org/dev/peps/pep-0318/#design-goals
[6] https://bugs.python.org/issue1671208
本文檔已經放置在公共領域。源文檔:
https://github.com/python/peps/blob/master/pep-3129.txt
公衆號【Python貓】, 本號連載優質的系列文章,有喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫做、優質英文推薦與翻譯等等,歡迎關注哦。