Python面向对象编程(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.10 总结

在本章中,我们快速浏览了面向对象范例的术语,重点介绍了面向对象的设计。我们可以将不同的对象分成不同的类,并通过类接口描述这些对象的属性和行为。抽象、封装和信息隐藏是高度相关的概念。对象之间存在许多不同类型的关系,包括关联、组合和继承。UML语法对有趣的交流很有用。

第2章将介绍如何在Python中实现类和方法。


[1] 麦叔注:类型提示是Python 3.6中引入的一种特性,我们会在第2章中学习。

[2] 麦叔注:以下示例与国际象棋有关。为了更好地理解下面的内容,建议读者先花几分钟自行查询和了解国际象棋的基本规则。比如棋子的类型、棋子的移动方法等。

[3] 麦叔注:组合对关系的要求更严格,外围对象要控制内部对象的创建和销毁;而聚合关系是一种更宽泛的关系,被包含者既可以是外围对象创建的,也可以是独立于外围对象的自由对象。组合关系是聚合关系中比较严格的一种。

[4] 麦叔注:如果子类有具体的move方法,则棋盘会调用子类的move方法,否则会调用父类的move方法,而这个方法会提示:棋子无法被移动。

[5] 麦叔注:在抽象方法中虽然没有实现,但包含方法名、参数列表和返回值。通过这些可以清晰地定义这个方法要完成什么任务,而具体如何实现任务就留给子类根据自己的特点完成,比如在象棋中,棋子马是按照日字形移动的,而棋子象是按照田字形移动的,它们虽然都实现了move方法,但是move方法中的具体实现很不一样。

[6] 麦叔注:鸭子类型可以被理解为只要你提供了所需的方法就可以,不管你的父类是什么。在棋子系统中,move方法是棋子必需的,任何有move方法的类都可以被当作棋子用,而不管它是否是Piece的子类。而在Java等强类型语言中,会同时要求你的类型正确和方法正确,也就是说棋子必须继承自Piece或者Piece的子类,否则就算有move方法也不能当作棋子。

[7] 麦叔注:mixin的中文是混合或混入,在不同的编程语言中具体含义不同。它通常指通过引入其他类或模块来增强当前类功能的一种编程模式,与通过继承来增加当前类的功能不同。

[8] 下面要介绍的KNN是最常用的机器学习算法之一。如果读起来有困难,则可以自行查找资料,补充一点儿相关基础知识,或关注麦叔公众号学习。

[9] 麦叔注:用户故事表示用户的操作场景,比如在ATM系统中,取钱是一个用户故事,存钱或查询余额又是另一个用户故事。

[10] 麦叔注:这个图的Sample类缺少分类属性。

[11] 麦叔注:类型提示是Python的一种语法,本书后面会讲解。

[12] 麦叔注:回顾前面的二维表格,植物学家要改变参数k,做不同的测试,最终确定k的最优值。

[13] 麦叔注:把已知数据集分成训练集和测试集两部分是机器学习的常见做法。训练集用于训练算法模型,测试集用于测试训练好的模型的效果。

[14] 麦叔注:Pythonic是为Python创造的单词,表示某个东西是符合Python风格的。

[15] 麦叔注:Restful API和HTTPS协议都属于网站开发相关知识,请根据需要自行学习,或关注麦叔公众号学习。