PEP原文:https://www.python.org/dev/peps/pep-3129PEP标题:ClassDecoratorsPEP作者:CollinWinter创建日期:2007-05-01合并版本:3.0译者:PeaFlowerUndertheCat(Python猫公众号作者)PEP翻译计划:https://github.com/chinesehua...摘要本PEP提出引入类装饰器,即PEP-318An的引入功能和方法装饰器的扩展。基本原理在讨论是否应该在Python2.4中引入函数装饰器时,由于元类[1],类装饰器被认为是晦涩和不必要的。然而,在Python2.4.x系列发布几年后,在对函数装饰器及其使用越来越熟悉之后,BDFL和社区重新评估了类装饰器,并建议将它们包含在Python3.0[2]中。此更改的目的是使某些构造更易于表达,并减少对CPython解释器实现细节的依赖。尽管可以使用元类实现具有类似装饰器功能的类,但结果往往令人不快,而且实现也很脆弱[3]。另外,元类是用来继承的,而类装饰器则不是,这使得元类不适合类装饰器的一些特定于类的使用场景。像Zope这样的大型Python项目正在经历这些疯狂的曲折,只是为了做类装饰器可以做的事情,这反而让BDFL更喜欢类装饰器。语义类装饰器的语义和设计目标与函数装饰器相同([4],[5]);唯一的区别是它装饰的是一个类而不是一个函数。以下两个片段在语义上是相同的:classA:passA=foo(bar(A))@foo@barclassA:pass有关装饰器的详细解释,请参阅PEP-318。实现调整Python的语法以支持类装饰器需要修改两个规则并添加一个新规则:while_stmt|for_stmt|尝试stmt|with_stmt|函数定义|classdef需要变成这样:decorated:decorators(classdef|funcdef)funcdef:'def'NAMEparameters['->'test]':'suitecompound_stmt:if_stmt|while_stmt|for_stmt|尝试stmt|with_stmt|函数定义|类定义|decorated添加decorated是避免语法歧义的必要条件。必须相应地修改PythonAST和字节码。JackDiederich提供了一个参考实现[6]。采纳这个PEP发布后,几乎没有讨论,这意味着每个人都认为它应该被采纳。该补丁已作为版本55430提交给Subversion。参考文献[1]http://www.python.org/dev/pep...[2]https://mail.python.org/piper...[3]https://mail.python.org/piper...[4]http://www.python.org/dev/pep...[5]http://www.python.org/dev/pep...[6]https://bugs.python.org/issue...版权本文档已置于公共领域。源文件:https://github.com/python/peps/blob/master/pep-3129.txt公众号【Python猫】,本号连载一系列优质文章,包括喵星哲学猫系列,Python进阶系列、好书推荐系列、技术写作、优质英文推荐及翻译等,欢迎关注。
