- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
第25章 OOP:宏伟蓝图
本章要开始我们对Python类的探索:类是在Python实现支持继承的新种类的对象的部件。类是Python面向对象程序设计(OOP)的主要工具,而本书这一部分内容中,我们将会一直讨论OOP的基础内容。OOP提供了一种不同寻常而往往更有效的检查程序的方式,利用这种设计方法,我们分解代码,把代码的冗余度降至最低,并且通过定制现有的代码来编写新的程序,而不是在原处进行修改。
在Python中,类的建立使用了一条新的语句:class语句。正如你将看到的那样,通过class定义的对象,看起来很像本书之前研究过的内置类型。事实上,类其实是只运用并扩展了我们谈到过的一些想法。概括地讲,类就是一些函数的包,这些函数大量使用并处理内置对象类型。不过,类的设计是为了创建和管理新的对象,并且它们也支持继承。这是一种代码定制和复用的机制,到现在为止,我们还没有见过。
还有件事要注意:在Python中,OOP完全是可选的,并且在初学阶段不需要使用类。实际上,可以用较简单的结构,例如函数,甚至简单顶层脚本代码,这样就可以做很多事。因为妥善使用类需要一些预先的规划。因此和那些采用战术模式工作的人相比(时间有限),采用战略模式工作的人(做长期产品开发)对类会更感兴趣一些。
然而,阅读本书这一部分你会得知,类是Python所提供的最有用的工具之一。合理使用时,类实际上可以大量减少开发的时间。类也在流行的Python工具中使用,例如,tkinter GUI API。所以大多数Python程序员往往都会发现,学习类的基础知识是很有帮助的。
为何使用类
还记得本书曾介绍过,程序就是“用一些东西来做事”吗?简而言之,类就是一种定义新种类的东西的方式,它反映了在程序领域中的真实对象。例如,假设要实现第16章作为例子的虚拟的制作比萨的机器人。如果通过类来实现,就可以建立其实际结构和关系的模型。从两个方面来讲OOP都证明很有用处。
继承
制作比萨的机器人就是某种机器人,它拥有一般机器人属性。从OOP术语来看,制作比萨的机器人继承了所有机器人的通用类型的属性。这些通用的属性只需要在通用的情况下实现一次,就能让未来我们所创建的所有种类的机器人重用。
组合
制作比萨机器人其实是一些组件的集合,这些组件以团队的形式共同工作。例如,机器人要成功,也许会需要机器臂滚面团,马达启动烤箱等。以OOP的术语来讲,机器人是一个组合的实例,它包含其他对象,这些对象来运作完成相应的指令。每个组件都可以写成类,定义自己的行为以及关系。
像继承和组合这些一般性OOP概念,适用于能够分解成一组对象的任何应用程序。例如,在一般GUI系统中,接口是写成图形组件的集合(按钮、标签等),当绘制图形组件的容器时,图形组件也会跟着绘制(组合)。此外,我们可以编写定制的图形组件——有独特字体的按钮、有新的配色的标签等,这些都是更通用接口机制(继承)的特定化的版本。
从更具体的程序设计观点来看,类是Python的程序组成单元,就像函数和模块一样:类是封装逻辑和数据的另一种方式。实际上,类也定义新的命名空间,在很大程度上就像模块。但是,和我们已见过的其他程序组成单元相比,类有三个重要的独到之处,使其在建立新对象时更为有用。
多重实例
类基本上就是产生对象的工厂。每次调用一个类,就会产生一个有独立命名空间的新对象。每个由类产生的对象都能读取类的属性,并获得自己的命名空间来储存数据,这些数据对于每个对象来说都不同。
通过继承进行定制
类也支持OOP的继承的概念。我们可以在类的外部重新定义其属性从而扩充这个类。更通用的是,类可以建立命名空间的层次结构,而这种层次结构可以定义该结构中类创建的对象所使用的变量名。
运算符重载
通过提供特定的协议方法,类可以定义对象来响应在内置类型上的几种运算。例如,通过类创建的对象可以进行切片、级联和索引等运算。Python提供了一些可以由类使用的钩子,从而能够中断并实现任何的内置类型运算。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论