别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

  • Sockets编程

  • Django

  • stackoverflow

  • Flask

  • 全栈之路

  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

    • PEP 中文翻译计划
    • [译] PEP-8 -- 编码风格指南中文版✨✨
    • [译] PEP202--列表推导式
    • [译] PEP 255--简单的生成器
    • [译] PEP 285--添加一种布尔类型
    • [译] PEP 318--函数和方法的装饰器
    • [译] PEP 328--导入多行及绝对/相对
    • [译]pep 333 -- Python Web 服务器网关接口 v1.0
    • [译]PEP 342--增强型生成器——协程
    • [译]PEP 380--子生成器的语法
    • [译]PEP 484 -- 类型提示
    • [译] PEP 525--异步生成器
    • [译] PEP 530--异步推导式
    • [译] PEP614--放宽对装饰器的语法限制
    • [译] PEP-312--Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
    • [译]PEP 3099--Python 3 中不会改变的事情
    • [译] PEP 3105--改 print 为函数
    • [译]PEP 3107 -- 函数注解
    • [译]PEP-3129 类装饰器
      • 摘要
      • 原理阐述
      • 语义
      • 实现
      • 验收
      • 参考资料
      • 版权
    • [译] PEP 3155--类和方法的特定名称
    • [译]pep 3333 -- Python Web 服务器网关接口 v1.0.1
  • Python工匠系列

  • 高阶知识点

  • Python 学习资源待整理
  • 设计模式

  • 好“艹蛋”的 Python 呀!
  • FIFO | 待学清单📝
  • pip 安装及使用
  • 数据分析

  • 源码阅读计划

  • OOP

  • 关于 python 中的 setup.py
  • 并行分布式框架 Celery
  • 七种武器,让你的代码提高可维护性
  • 使用 pdb 调试 Python 代码
  • 每周一个 Python 标准库
  • 🐍Python
  • PEP
佚名
2019-11-27
目录

[译]PEP-3129 类装饰器

# [译]PEP-3129 类装饰器

PEP 原文 : https://www.python.org/dev/peps/pep-3129 (opens new window)

PEP 标题: Class Decorators

PEP 作者: Collin Winter

创建日期: 2007-05-01

合入版本: 3.0

译者 :豌豆花下猫 (opens new window)(Python 猫 公众号作者)

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]。

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

# 语义

类装饰器的语义和设计目标与函数装饰器的语义和设计目标相同([4],[5]); 唯一的区别是它在装饰类而不是函数。 以下两个片段在语义上是相同的:

class A:
  pass
A = foo(bar(A))


@foo
@bar
class A:
  pass
1
2
3
4
5
6
7
8
9

有关装饰器的详细解释,请查阅 PEP-318。

# 实现

调整 Python 的语法以支持类修饰符,需要修改两个规则并添加一个新规则:

funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite

compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
               with_stmt | funcdef | classdef
1
2
3
4

需要变成这样:

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
1
2
3
4
5
6

添加 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 (opens new window)

编辑 (opens new window)
#装饰器
上次更新: 2024-07-15, 08:03:22
[译]PEP 3107 -- 函数注解
[译] PEP 3155--类和方法的特定名称

← [译]PEP 3107 -- 函数注解 [译] PEP 3155--类和方法的特定名称→

最近更新
01
提升沟通亲和力的实用策略
03-26
02
工作
07-15
03
如何选房子
06-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式