Python不只是解释性语言,也是一门面向对象的编程语言,因此自定义对象是Python语言的核心之一。类使得程序设计更加抽象,通过类的继承及其他常用方法,可以让程序语言更接近人类的语言。
(1) 了解面向对象编程的发展、实例、优点。
(2) 了解使用面向对象编程的情形。
(3) 掌握类的定义、使用和专有方法。
(4) 掌握self参数的使用。
(5) 掌握对象的创建(实例化)、删除。
(6) 掌握对象的属性、方法引用和私有化方法。
(7) 掌握迭代器和生成器。
(8) 掌握类的继承、重载、封装等其他方法。
1. 面向对象编程
面向对象编程(Object Oriented Programming,OOP)即面向对象程序设计。类和对象是OOP中的两个关键内容,在面向对象编程中,以类来构造现实世界中的事物情景,再基于类创建对象来进一步认识、理解、刻画。根据类来创建的对象,每个对象都会自动带有类的属性和特点,然后可以按照实际需要赋予每个对象特有的属性,这个过程被称为类的实例化。
抽象的直接表现形式通常为类。抽象指对现实世界的事物,行为和特征建模,建立一个相关的数据集用于描绘程序结构,从而实现这个模型。抽象不仅包括这种模型的数据属性,还定义了这些数据的接口。从面向对象设计(Object Oriented Design,简称OOD)角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的,可以进行相似编码,或者编入与对象交互的对象中。从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
2. 面向对象方法
面向对象方法(Object Oriented Method),简称OO方法,是在软件开发过程中以“对象”为中心,用面向对象的思想来指导开发活动的系统方法。正如研究OO方法的专家和学者所说,近十多年来,OO方法正在像70年代结构化方法对计算机技术应用所产生的巨大影响和促进那样,一直在强烈地影响和促进一系列高技术的发展和多学科的综合。
面向对象方法起源于面向对象的编程语言。20世纪50年代后期,在编写大型程序时,常出现相同变量名在程序不同部分发生冲突的问题。对于这个问题,ALGOL语言的设计者在ALGOL60中用“Begin……End”为标识的程序设计形成局部变量,避免它们与程序中其他同名变量相冲突。这是编程语言中首次提供封装的尝试,后来此结构广泛用于高级语言如Pascal、Ada、C之中。
1986年在美国举行了首届“面向对象编程、系统、语言和应用(OOPSLA'86)”国际会议,使面向对象受到世人瞩目,其后每年一届,这标志着面向对象方法的研究已普及到全世界。面向对象方法已被广泛应用于程序设计语言、数据库、设计方法学、人机接口、操作系统、分布式系统、人工智能、实时系统、计算机体系结构以及并发工程、综合集成工程等众多领域,同时在其领域应用都得到了很大的发展。例如,现代的面向对象程序设计方法使得设计模式的用途、契约式设计和建模语言(如UML)技术也得到了一定提升。
3. 面向对象编程语言
20世纪60年代中后期,在ALGOL基础上研制开发了Simula语言,提出了对象的概念,并使用了类,也支持类继承,出现了面向对象程序设计的雏形。70年代,经典的Smalltalk语言诞生,它以Simula的类为核心概念,以Lisp语言为主要内容。由于Smautalk持续不断的改进,引入了对象、对象类、方法、实例等概念和术语,采用动态联编和单继承机制,以至于现在都将这一语言视为面向对象的基础。
正是通过Smalltalk不断的改进与推广应用,人们才发现面向对象方法具有模块化、信息封装与隐蔽、抽象性、继承性、多态性等独特之处,为研制大型软件、提高软件可靠性、可重用性、可扩充性和可维护性提供了有效的手段和途径。例如,分解和模块化可以给不同组件设定不同的功能,把一个问题分解成多个小的、独立的、互相作用的组件,来处理复杂、大型的软件。
从20世纪80年代起,面向对象程序设计成为了一种主导思想,但一直没有专门面向对象程序设计的语言。人们将以前提出有关信息封装与隐蔽、抽象数据类型等概念,以及BASIC、Ada和Smalltalk和Modula-2等语言进行了糅合,却常常出现兼容性和维护性问题。后来因为客观需求的推动,大量的理论研究和实践探索的进行以及不同类型的面向对象语言(如Eiffel、C++、Java、Object-Pascal等)的产生发展,逐步解决了这些问题。
在过去几年中,Java语言成为了广为应用的语言,除了它与C语言语法上的近似,还有面向对象编程的强大一面,即Java的可移植性。在近几年计算机语言发展中,一些既支持面向过程程序设计(该怎么做),又支持面向对象程序设计(对象该怎么做)的语言崭露头脚,如Python、Ruby等。
4. 体会面向对象实例
面向对象出现以前,结构化程序设计是程序设计的主流,结构化程序设计又称为面向过程的程序设计。面向过程是分析出解决问题所需要的步骤,然后用函数一步一步实现这些步骤,使用的时候一个一个依次调用即可。而面向对象是把构成问题的事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:开始游戏;黑子先走;绘制画面;判断输赢;轮到白子;绘制画面;判断输赢;返回步骤2;输出最后结果。把每个步骤分别用函数来实现,问题就解决了。而面对对象的设计则是从另一种思路来解决问题。黑白双方,这两方的行为是一模一样的;棋盘系统,负责绘制画面;规则系统,负责判断诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入信息,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的输入就要负责在画面上显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显的看出,面向对象是以功能来划分问题,而不是循环步骤。同样是绘制棋局,在面向过程的设计中,需要多个步骤执行该任务。但这样很可能导致不同步骤的绘制棋局程序不同,因为设计人员会根据实际情况对绘制棋局的程序进行简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证绘制棋局的统一。
5. 面向对象编程的优点
在面向过程程序设计中,问题被看作一系列需要完成的任务,解决问题的焦点集中于函数。其中函数是面向过程的,即它关注如何根据规定的条件完成指定的任务。在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。但每个函数都可以具有自己的局部数据。这样的程序结构很容易造成全局数据在无意中被其他函数改动,导致程序的不准确性。面向对象程序设计的出发点之一就是弥补面向过程程序设计中的一些缺点。
(1) 数据抽象的概念可以在保持外部接口不变的情况下对内部进行修改,从而减少甚至避免对外界的干扰。
(2) 通过继承可以大幅减少冗余代码,并可以方便地拓展现有代码,提高编码效率,也降低了出错概率,降低了软件维护难度。
(3) 结合面向对象分析、面向对象设计,允许将问题中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程。
6. 何时使用面向对象编程
面向对象的程序与人类对事物的抽象理解密切相关。举一个例子,精灵宝可梦这款游戏的具体代码我们不知道,但可以确定的是其程序是通过面向对象的思想编写的。将游戏中的每种精灵看作一个类,而具体的某只精灵就是其中一个类的一个实例对象,所以每种精灵的程序具有一定的独立性。开发者可以同时编写多只精灵的程序,它们之间不会相互影响。
为什么这里不能使用面向过程编程?如果要开发新的精灵,那么必须对之前的程序做大规模的修改,以使程序的各个函数能够正常工作(以前的函数没有新精灵的数据)。所有现在的程序和软件开发都是使用面向对象编程的,最重要的原因还是其良好的抽象性。但对于小型程序和算法来说,面向对象的程序一般会比面向过程的程序慢,所以两种思想各有利弊。
Python面向对象编程系列文章两周一更!
文章未经博主同意,禁止转载!