Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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 318PEP 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

上次修改:2025-02-01 08:59:27 GMT