PEP 3129 – 类装饰器
- 作者:
- Collin Winter <collinwinter at google.com>
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2007年5月1日
- Python 版本:
- 3.0
- 发布历史:
- 2007年5月7日
摘要
本PEP提议引入类装饰器,作为PEP 318中引入的函数和方法装饰器的扩展。
基本原理
当函数装饰器最初被讨论是否纳入Python 2.4时,由于元类的存在,类装饰器被认为是晦涩且不必要的。经过几年对Python 2.4.x系列版本的经验以及对函数装饰器及其用法的日益熟悉,BDFL和社区重新评估了类装饰器,并建议将其纳入Python 3.0 [1]。
其主要用例是为了使某些构造更容易表达,并减少对CPython解释器实现细节的依赖。虽然可以使用元类来表达类似类装饰器的功能,但结果通常不尽如人意,并且实现非常脆弱[2]。此外,元类是可继承的,而类装饰器则不是,这使得元类不适用于某些仅针对单个类的类装饰器用法。像Zope这样的大型Python项目为了实现类似类装饰器的功能而经历的这些复杂的变形,最终说服了BDFL。
语义
类装饰器的语义和设计目标与函数装饰器相同(PEP 318,PEP 318);唯一的区别是您装饰的是类而不是函数。以下两个代码片段在语义上是相同的
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提供了一个参考实现[3]。
接受
在发布此PEP后几乎没有讨论,这意味着大家都同意它应该被接受。
补丁已作为修订版本55430提交到Subversion。
参考资料
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3129.rst