Python面向对象(1)——基本概念

刚接触python编程的时候,就开始学习面向对象,经过这么多年的编程实践,记住了一大堆类、对象的概念,也经常使用class、self这些来定义类,可以说这些语法都已经比较熟练了,但是仍然对面向对象没有一个系统化的认识。

让我使用可以,但是让我讲出所以然、讲出前因后果就差了很多,所以专门抽时间梳理了一下相关的知识,也分享出来,请大家批评指正。


面向对象概念:

百度百科上对面向对象的解释是:
  """
  面向对象是软件开发方法。
  面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
  面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
  """

维基百科上对面向对象的解释是:
  """
  1. 面向对象的程序设计(OOP),一种设计程序的思想。
  2. 面向对象的系统分析,一种对问题环境的模拟分析方法。
  """

面向对象程序设计:
  """
  面向对象程序设计(Object-oriented programming,缩写: OOP)是一种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码和方法。
  对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关联的数据。
  在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
  ......
  当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。
  """

根据百度百科和维基百科上关于'面向对象'的描述总结有以下几个问题需要解决:
  1. 面向对象分析(Object-Oriented Analysis OOA),面向对象设计(Object-Oriented Design,OOD)、面向对象编程(Object-Oriented Programming, OOP)这三个概念是什么? 它们与面向对象之间是什么关系? 面向对象是什么?
  2. 面向对象是相对于面向过程来讲的-->什么是面向过程?为什么不继续使用面向过程而要使用面向对象?面向过程和面向对象的优缺点。
  3. 面向对象中的对象是什么?
  4. 面向对象的特征有哪些?

接下来分别对上面提到的问题进行梳理:

1. 什么是面向对象?
面向对象是一整套软件开发方法,它是由OOA 面向对象分析、OOD面向对象设计、OOP面向对象编程组成的。
这是一种自底向上和自顶向下相结合的方法,而且它以对象建模为基础,从而不仅考虑了输入、输出数据结构,实际上也包含了所有对象的数据结构。
面向对象技术在需求分析、可维护性和可靠性这三个软件开发的关键环节和质量指标上有了实质性的突破,彻底地解决了软件开发在这些方面存在的严重问题,从而宣告了软件危机末日的来临。

  """
  一些背景知识:
  软件危机:
  软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。

  20 世纪60年代以前,计算机刚刚投入实际使用,软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制,
  采用密切依赖于计算机的机器代码或汇编语言,软件的规模比较小,文档资料通常也不存在,很少使用系统化的开发方法,
  设计软件往往等同于编制程序,基本上是个人设计、个人使用、个人操作、自给自足的私人化的软件生产方式。

  60年代中期,大容量、高速度计算机的出现,使计算机的应用范围迅速扩大,软件开发急剧增长。
  高级语言开始出现;操作系统的发展引起了计算机应用方式的变化;
  大量数据处理导致第一代数据库管理系统的诞生。
  软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出。
  原来的个人设计、个人使用的方式不再能满足要求,迫切需要改变软件生产方式,提高软件生产率,软件危机开始爆发。

  1968年,北大西洋公约组织(NATO)在联邦德国的国际学术会议创造软件危机(Software crisis)一词。而1960年代中期开始爆发众所周知的软件危机,为了解决问题,在1968、1969年连续召开两次著名的NATO会议,并同时提出软件工程的概念。

  软件开发方法是为了克服软件危机诞生的软件工程学科中的一部分,至今为止已经发展处8类软件开发方法,面向对象软件开发方法是其中的一种。
  """

2. 什么是面向过程?
  面向过程就是分析出解决问题需要的步骤,并用函数、子程序、运算过程等方式将这些步骤实现,在使用的时候依次调用。
  面向过程主要采用程序调用或者函数调用的方式来进行流程控制,流程由一系列的运算步骤过程、子程序、方法、函数来控制。

3. 为什么要发展面向对象?
  面向过程的优点:
    1. 最容易想到的实现方式,实现过程简单直白;
    2. 面向过程没有过多封装,所以性能更好。
  面向过程的缺点:
    1. 审视问题的视觉与人类解决问题的常规方式不同
      面向过程解释现实的视角不如面向对象的方法先进。面向过程将程序划分成不同功能,顺序执行。
      面向对象则是将自然环境中的所有客观事物都当成对象,每个客观事物有自身的属性和行为,程序是由这些客观事物之间的行为和数据互动形成。
      面向对象审视问题的方式更接近人类解决问题的常规方式。

    2. 抽象过于特化导致抽象的作用降低
      面向对象的抽象是对数据和行为的抽象,一个对象的数据和行为变化小而稳定。
      面向过程的抽象是对过程的抽象,是将一个问题中的每个步骤的功能抽象出来,作为一个实体来看待。
      如果实现这个功能的客体属性发生细微的变化,就需要重新抽象,过程中的各个环节都要配合变化,起不到真正抽象的作用。

    3. 封装无法隔绝数据与行为
      封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
      该逻辑单元负责将所描述的属性隐藏起来,外界对客体内部属性的所有访问只能通过提供的用户接口实现。
      这样做既可以实现对客体属性的保护作用,又可以提高软件系统的可维护性。
      只要用户接口不改变,任何封装体内部的改变都不会对软件系统的其他部分造成影响。
      面向过程的设计方法没有做到客体的整体封装,只是封装了各个功能模块,而每个功能模块可以随意地对没有保护能力客体属性实施操作。
      并且由于描述属性的数据与行为被分割开来,所以一旦某个客体属性的表达方式发生了变化,或某个行为效果发生了改变,就有可能对整个系统产生影响

    4. 抽象粒度高导致可重用性差
      面向过程是对功能模块的抽象,抽象出来的功能模块只是实现特定的功能,它的可重用单位只能是模块。如果需要相似的功能,但是处理不同类型的数据,原有的模块需要修改才能使用,重用性不高。
      而可重用性高的软件能极大提高软件开发效率,软件更具通用性,可以更快推动相关应用领域的发展。
      可重用性是当前软件开发的基本要求,面向过程的程序设计方法在可重用性方面存在明显劣势。
      ...
  总结:
    面向过程相对于面向对象的劣势是在对复杂系统的开发上,面向过程的易用性、可维护性、可重用性都比面向对象差。
    而计算机的发展,需要一种程序设计方法来解决复杂系统的设计问题,面向对象这种相对易用、更易维护、可重用性更高的程序设计方法就逐渐发展起来。

  理解面向过程和面向对象区别的例子:
    面向过程的设计思路就是首先分析问题的步骤:
    1、开始游戏,
    2、黑子先走,
    3、绘制画面,
    4、判断输赢,
    5、轮到白子,
    6、绘制画面,
    7、判断输赢,
    8、返回步骤2,
    9、输出最后结果。
    把上面每个步骤用不同的方法来实现。

  面向对象的设计则是从另外的思路来解决问题。
    整个五子棋可以分为:
    1、黑白双方,这两方的行为是一模一样的,
    2、棋盘系统,负责绘制画面,
    3、规则系统,负责判定诸如犯规、输赢等。
    第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

4.  什么是对象?
  对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。
  在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。
  在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。
  对象则是数据和动作的结合体。
  对象不仅能够进行操作,同时还能够及时记录下操作结果。

  总结:
  对象在现实中是具体的客观事物,在计算机程序中是数据与行为的结合体,对象与对象之间数据和行为的交互组成了程序。

5. 面向对象基本概念
  对象、方法、类、继承、封装、多态。

  对象在前面的"什么是对象"中已经讲过。

  方法就是类中定义的函数,用于描述对象的行为。
    """
    方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。
    方法是类中的定义函数,其具体的作用就是对对象进行描述操作。
    """

  继承就是子类可以继承父类的属性和方法,并且可以增加或者修改属性和方法,作用是减少冗余定义,便于衍生复杂系统、提高效率。
    """
    继承简单地说就是一种层次模型,这种层次模型能够被重用。
    层次结构的上层具有通用性,但是下层结构则具有特殊性。
    在继承的过程中类则可以从最顶层的部分继承一些方法和变量。
    类除了可以继承以外同时还能够进行修改或者添加。
    通过这样的方式能够有效提高工作效率。
    当类X继承了类Y后,此时的类X则是一个派生类,而类Y属于一个基类。 继承是从一般演绎到特殊的过程,可以减少知识表示的冗余内容,知识库的维护和修正都非常方便。
    更有利于衍生复杂的系统。
    """

  类是具有相同数据和行为的对象的抽象,类可以减少问题的复杂度。
    """
    类是具有相同特性(数据元素)和行为(功能)的对象的抽象。
    因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
    类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
    类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。 类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。
    """

  封装就是包装数据与行为,实现对数据和行为的隐藏,定义访问权限。
    """
    封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。
    防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。
    有效实现了两个目标:对数据和行为的包装和信息隐藏。
    """

  多态是指不同的对象可以调用具有相同名称的方法,方法的具体内容根据对象变化,从而减少代码的复杂度。
    """
    多态是指不同事物具有不同表现形式的能力。
    多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。一个接口,多种方式。

    动态绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。
    """

    """
    消息传递:对象之间需要相互沟通,沟通的途径就是对象之间收发信息。
    消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。
    
    """

  面向对象的方法就是利用抽象、封装等机制,借助于对象、类、继承等概念进行软件系统构造的软件开发方法。

以上就是我收集的面向对象的基本知识,勉强形成了一条逻辑线,知道这些就对面向对象的来源、发展、定义和特点有一定的了解了,更有助于学习Python中面向对象相关的语法。

原文地址:https://www.cnblogs.com/hufulinblog/p/13458650.html