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进阶系列、好书推荐系列、技术写做、优质英文推荐与翻译等等,欢迎关注哦。