【译】PEP-3129 类装饰器
PEP原文 : https://www.python.org/dev/peps/pep-3129
PEP标题: Class Decorators
PEP作者: Collin Winter
创建日期: 2007-05-01
合入版本: 3.0
译者 :豌豆花下猫(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
有关装饰器的详细解释,请查阅 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] 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

公众号【Python猫】, 本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。
【译】PEP-3129 类装饰器的更多相关文章
- python装饰器2:类装饰器
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...
- 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块
'''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...
- python 描述符 上下文管理协议 类装饰器 property metaclass
1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分py ...
- 详解Python闭包,装饰器及类装饰器
在项目开发中,总会遇到在原代码的基础上添加额外的功能模块,原有的代码也许是很久以前所写,为了添加新功能的代码块,您一般还得重新熟悉源代码,稍微搞清楚一点它的逻辑,这无疑是一件特别头疼的事情.今天我们介 ...
- [b0019] python 归纳 (五)_类装饰器
总结: 类装饰器, 本质是一个函数,输入一个类,返回一个类 Case 1 啥都没做 def deco(in_class): return in_class @deco class Cat: def _ ...
- python带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的类装饰器(和不带参数的类装饰器有很大的不同) # 类装饰器的实现,必须实现__call__和__init_ ...
- typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂
/* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...
- Python不带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 不带参数的类装饰器 # 类装饰器的实现,必须实现__call__和__init__两个内置函数. # __init ...
- python高级 之(二) --- 类装饰器
装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...
- python 进阶篇 函数装饰器和类装饰器
函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...
随机推荐
- Codeforce1343C. Alternating Subsequence
Recall that the sequence b is a a subsequence of the sequence a if b can be derived from a by removi ...
- 2020年第十一届蓝桥杯省赛 第一场(7月5日)B组个人题解
PDF文件下载: https://files.cnblogs.com/files/Angel-Demon/CB.zip 试题 A: 跑步训练 [问题描述] 小明要做一个跑步训练. 初始时,小明充满体力 ...
- 前端科普系列(3):CommonJS 不是前端却革命了前端
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/15sedEuUVTsgyUm1lswrKA作者:Morrain 一.前言 上一篇<前端科 ...
- spring管理实务有几种方式
一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- nextTick使用
- C#设计模式01——单例模式的三种写法
第一种 //在方法里new ,这里使用 双if-lock public class SingleFirst { private static SingleFirst _SingleFirst; pri ...
- excel如何自动获取本周工作日的日期显示作为标题(周一至周五)
一.背景: 每周发周报的标题格式为:本周一到本周五的日期内容,如下:但是每隔一周发送的时候需要改一下周报标题里面的日期,比较麻烦目前的需求是通过函数自动化生成,根据当前的日期去定位出本周一的日期以及本 ...
- ava进阶(39)--守护线程与定时器
文档目录: 一.守护线程 二.定时器 ---------------------------------------分割线:正文------------------------------------ ...
- MySQL 覆盖索引详解
本文转载自:MySQL 覆盖索引详解,作者 Sevn 1. 什么是索引? 索引(在 MySQL 中也叫"键key")是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录. ...
- 30-组合可编程逻辑器件-PLD
组合可编程逻辑器件 1.PLD的结构 1.1 结构 1.2 表示方法 实心点表示连接,但是不可编程 ×点表示连接,但是可以编程 2.编程技术 2.1 熔丝工艺 每个输入线连接二极管和保险丝 2.2 电 ...