《计算思维导论:程序设计思想与方法》——第7章:面向对象思想与编程

7.1 数据与操作:两种观点
  1. 用计算机解决问题的关键是确定问题所涉及的数据以及对数据的操作。
  2. 在程序设计思想和方法的发展过程中存在两种不同的观点:一种是传统的以操作为中心的面向过程观点,一种是现代的以数据为中心的面向对象的观点。
7.1.1 面向过程观点
  1. 在面向过程的编程范型中,强调的是对数据的操作过程,程序员思考的主要问题是数据如何表示、对各数据执行什么操作以及各操作的先后顺序如何安排。
7.1.2 面向对象观点
  1. 面向对象思想中最基本的观点:数据和对数据的操作不可分离
  2. 基于对象概念来分析问题和设计解法,就是面向对象编程(object-orientation programming,简称OOP)。
  3. 将数据和对数据的操作融为一体,形成具有静态信息和动态行为的对象。
7.1.3 类是类型概念的发展
  1. 类是广义的数据类型,能够定义复杂数据的特性,包括静态特性(即数据)和动态特性(即对数据的操作方法)。
7.2 面向对象编程

OOP的特色包括抽象、封装、消息、模块化、多态性、继承等。

7.2.1 类的定义
  1. 利用OOP来解决问题时,首要任务就是确定该问题涉及哪些对象,每种对象分别具有什么数据和操作。类就是对这些信息的表达。
  • 抽象
  1. 抽象就是忽略事物中与当前目标无关的、非本质的特征,而抽取与当前目标有关的、本质的特征。
  2. 抽象是面向对象的基本方法,而抽象的工具就是“类”。包括两方面的抽象:数据抽象和行为抽象。数据抽象描述某类对象共有的属性或状态,行为抽象描述某类对象共有的行为或功能特征。
  • 封装
  1. 封装是指用类将对象的数据和操作结合成一个封闭的程序单元,并对外部隐藏内部实现细节。隐藏信息包含两重意思:一是用户无需了解隐藏的信息就能使用该类,二是不允许用户直接操作类中被隐藏的信息。
  • Python类定义
  1. Python中类的定义如下:
    class <类名>:
    <方法定义1>:

    <方法定义n>:
    其中“方法定义”就是对对象的操作行为的定义,外界能够请求对象所做的事情完全由这些方法决定。
  2. 每个方法定义其实都是一个函数定义,即形如:
    def <方法名>(<参数>):

    方法与普通函数略有差别。首先,每个方法都必须有一个特殊的形参self,并且self必须是该方法的第一个形参。其次,方法只能通过对象来调用,即向对象发消息请求对象执行某个方法。
  3. 在 Python 中,类的实例所拥有的数据一般在类的方法中定义的,尤 其是在一个特殊方法__init__方法中。这里的方法名__init__是 Python 规定的,通常每个类 都会定义__init__方法,其功能将在介绍类实例创建时进行解释。
  4. 以“self.<变量名>”形式定义的变量称为实例变量(instance variable),意思是这种数据是属于类的实例的,不同的实例可以有不同的值。
  5. 实例变量可以在类的任何方法中定义,也可以在类的任何方法中直接引用。
  6. 面向对象编程中习惯上使用大写字母开头的标识符来为类命名,而类中方法和实例变量则惯常使用小写字母开头的标识符来命名。方法名如果由多个单词构成,一般采用骆驼式命名法,即除第一个单词之外各单词首字母大写。
7.2.2 对象的创建
  1. 创建类的实例采用如下形式:
    <变量> = <类名>(<参数>)
    这里将类名当成一个函数来用,称为类的构造器(constructor,或称为构造函数)。构造器返回一个新对象,通常需要定义<变量>来引用这个新对象。
7.2.3 对象方法的调用
  1. 一旦创建了对象,就可以通过向对象发消息来调用对象的方法。消息的格式如下:
    <对象>.<方法>(<实参>)
  2. 类方法的第一个参数所用的参数名 self 只是 Python 语言的惯例,而非硬性 规定,完全可以使用别的名字。
7.2.4 编程实例:模拟炮弹飞行
7.2.5 类与模块化
  1. 对复杂程序一般有两种分解方法:功能分解和数据分解。功能分解是面向过程编程的基础,依赖于子程序(如函数)概念,以过程为中心来建立功能模块;数据分解则是面向对象编程的基础,依赖于类的概念,以数据为中心来建立数据模块。
7.2.6 对象的集合体
  1. 复杂数据的复杂体现在:要么该数据是由大量成员数据组成的,要么该数据具有深层的内部结构。
  2. 类+集合体 = 任意复杂的数据
7.3 超类与子类
  1. 通过一般与特殊的关系,可以将所有类组织成为一个层次结构,称为类层次。
7.3.1 继承
  1. 子类拥有超类的全部属性(数据和方法),这是面向对象方法中极为重要的一个特色,称为继承(inheritance)。
  2. 在进行面向对象设计时,一般先定义超类,然后在超类基础上通过添加一些特殊属性来定义子类。
  3. Python中定义子类采用如下形式:
    class <子类名>(<超类名>):
    <特殊属性1>

    <特殊属性n>
  4. 如果超类在另一个模块中定义,则定义子类时必须指明模块信息:
    class <子类名>(<模块名>.<超类名>):
7.3.2 覆写
  1. 在子类中重新定义超类方法的情况称为覆写(overwrite,或称重定义)。
7.3.3 多态性
  1. 在OOP中,多个不同类的对象都支持相同的消息,但各对象响应信息的行为不同,这种能力称为多态性,即同一操作具有不同形态的意思。
7.4 面向对象设计
  1. 面向对象设计是以数据为中心来展开的。对象通过界面向外界提供数据操作服务,服务的使用者只需了解服务接口,不必关系服务的实现细节。
  2. OOD的中心任务是设计各种对象,将对象的数据和行为用类来定义。OOD将一个复杂问题分解成一组相互协作的类,以类为设计单位可以大大减小设计的复杂性。
  • 描述问题
    OOD的第一步是要建立待解决问题的准确、无二义性的描述。
  • 找出候选对象
  • 确定对象的数据属性
  • 确定对象的行为属性
  • 实现对象的方法
  • 迭代设计
7.5 练习

书籍下载地址:https://download.csdn.net/download/qq_37590544/10959608

猜你喜欢

转载自blog.csdn.net/qq_37590544/article/details/87825391