- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
元类与类装饰器的关系:第二回合
·在class语句的末尾,类装饰器把类名重新绑定到一个函数的结果。
·元类通过在一条class语句的末尾把类对象创建过程路由到一个对象来工作。
尽管这些是略有不同的模型,实际上,它们通常可实现同样的目标,虽然采用的方式不同。实际上,类装饰器可以用来管理一个类的实例以及类自身。尽管装饰器可以自然地管理类,然而,用元类管理实例有些不那么直接。元类可能最好用于类对象管理。
基于装饰器的扩展
例如,前面小节的元类示例,像创建的一个类添加方法,也可以用一个类装饰器来编写。在这种模式下,装饰器大致与元类的__init__方法对应,因为在调用装饰器的时候,类对象已经创建了。也与元类类似,最初的类类型是保留的,因为没有插入包装器对象层。如下的输出与前面的元类代码的输出相同:
换句话说,至少在某些情况下,装饰器可以像元类一样容易地管理类。反过来就不那么直接了,元类可以用来管理实例,但是只有有限的力量。下一小节将说明这点。
管理实例而不是类
正如我们已经见到的,类装饰器常常可以和元类一样充当类管理角色。元类往往和装饰器一样充当实例管理的角色,但是,这更复杂一点。即:
·类装饰器可以管理类和实例。
·元类可以管理类和实例,但是管理实例需要一些额外工作。
也就是说,某些应用可能用一种方法或另一种方法编写更好。例如,前一章中的类装饰器示例,无论何时,获取一个类实例的任意常规命名的属性的时候,它用来打印一条跟踪消息:
这段代码运行的时候,装饰器使用类名重新绑定来把实例对象包装到一个对象中,该对象在如下的输出中给出跟踪行:
尽管用一个元类也可能实现同样的效果,但它似乎概念上不太直接明了。元类明确地设计来管理类对象创建,并且它们有一个为此目的而设计的接口。要使用元类来管理实例,我们必须依赖一些额外力量。如下的元类和前面的装饰器具有同样的效果和输出:
这也有效,但是它依赖于两个技巧。首先,它必须使用一个简单的函数而不是一个类,因为type子类必须附加给对象创建协议。其次,必须通过手动调用type来手动创建主体类;它需要返回一个实例包装器,但是元类也负责创建和返回主体类。其实,在这个例子中,我们将使用元类协议来模仿装饰器,而不是按照相反的做法。由于它们都在一条class语句的末尾运行,所以在很多用途中,它们都是同一方法的变体。元类版本运行的时候,产生与装饰器版本同样的输出:
你应该自己研究这两个示例版本,以权衡其利弊。通常,元类可能更适合于类管理,因为它们就设计为如此。类装饰器可以管理实例或类,然而,它们不是更高级元类用途的最佳选择(我们没有足够篇幅在本书中介绍,如果你在阅读完本章后,还想学习关于装饰器和元类的更多内容,请在Web上搜索或参阅Python标准手册的内容)。下一小节用一个更为常见的例子来结束本章,自动对一个类的方法应用操作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论