【译】PEP-3129 类装饰器

简介: 【译】PEP-3129 类装饰器


摘要

本 PEP 提议推出类装饰器,它是对 PEP-318 引入的函数与方法(function and method)装饰器的扩展。

原理阐述

当初讨论函数装饰器是否该在 Python 2.4 中引入时,由于有元类,所以类装饰器被视为晦涩且不必要的[1]。但是,在使用 Python 2.4.x 系列发行版本的几年后,对函数装饰器及其使用的日益熟悉之后,BDFL 和社区重新评估了类装饰器,并建议将其包含在 Python 3.0 中[2]。

这个改变的目的是使某些构造更易于表达,并且减少对 CPython 解释器的实现细节的依赖。尽管可以使用元类来实现类似装饰器(decorator-like)功能的类,但结果通常令人不快,实现起来也很脆弱[3]。另外,元类是要继承的,而类装饰器则不是,这使得元类不适合类装饰器的某些特定于类的使用场景。诸如 Zope 之类的大型 Python 项目正在经历这些疯狂的扭曲,就为了取得类装饰器能做到的成绩,这一点反而使 BDFL 青睐上了类装饰器。

语义

类装饰器的语义和设计目标与函数装饰器的语义和设计目标相同([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] www.python.org/dev/peps/pe…

[2] mail.python.org/pipermail/p…

[3] mail.python.org/pipermail/p…

[4] www.python.org/dev/peps/pe…

[5] www.python.org/dev/peps/pe…

[6] bugs.python.org/issue167120…


目录
相关文章
|
2月前
|
缓存 测试技术 数据库
【Python 基础】什么是装饰器(decorator)?
【5月更文挑战第6天】【Python 基础】什么是装饰器(decorator)?
|
2月前
|
缓存 Serverless Python
python基础篇:什么是装饰器?装饰器有什么用?
python基础篇:什么是装饰器?装饰器有什么用?
31 4
python基础篇:什么是装饰器?装饰器有什么用?
|
2月前
|
缓存 Python
Python中的装饰器:优雅而强大的函数装饰技术
在Python编程中,装饰器是一种强大而灵活的技术,它可以使函数具有额外的功能,而不需要改变函数的核心代码。本文将深入探讨装饰器的原理、用法以及实际应用场景,帮助读者更好地理解和利用这一重要的Python编程工具。
|
2月前
|
缓存 程序员 Python
探索Python中的装饰器:提升代码复用性与可维护性
【2月更文挑战第4天】在Python编程领域中,装饰器是一种强大的工具,可以提升代码复用性与可维护性。本文将深入探索Python中的装饰器,介绍其基本概念、使用方法和实际应用场景,并解释其对于程序员而言的重要性。
|
2月前
|
自然语言处理 Java 编译器
【译】PEP 318--函数和方法的装饰器
【译】PEP 318--函数和方法的装饰器
31 0
|
2月前
|
测试技术 开发者 Python
Python中的装饰器:提升代码复用性和可维护性
【2月更文挑战第1天】在Python编程中,装饰器是一种强大的工具,能够在不改变原有代码结构的情况下,增加功能和修改行为。本文将介绍装饰器的概念、用法以及如何利用装饰器提升代码的复用性和可维护性。
22 0
|
2月前
|
Python
Python 使用类实现装饰器
Python 使用类实现装饰器
34 0
|
2月前
|
数据安全/隐私保护 Python
解释装饰器(decorator)的功能和用法。
解释装饰器(decorator)的功能和用法。
|
2月前
|
Python
[python装饰器]什么是装饰器@
[python装饰器]什么是装饰器@
24 0