Python是一门面向对象的语言,了解什么是面向对象非常重要,也是软件开发的核心。本文主要涉及:
- 什么是面向对象
- 面向对象中的关键名词
- 示例
什么是面向对象
计算机语言可以归为面向过程语言和面向对象语言,那么到底什么是面向对象,什么是面向过程呢?网上找到一篇帖子对面向对象与面向过程的异同点说得非常好,这里直接引用其说法(原文)
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的。2、棋盘系统,负责绘制画面。3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
面向过程
概念:面向过程是一种以过程为中心的编程思想,它是一种基础的顺序的思维方式,面向对象方法的基础实现中也包含面向过程思想。
特性:模块化 流程化
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,在单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
概念:面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
特性:抽象 封装 继承 多态
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程要低
面向对象中的关键名词
在面向对象的语言中(包括Python在内)有些常见的术语(参考),这里先做下解释,这是后续学习的一个基础。
-
类(Class):
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 -
方法:类中定义的函数。
-
类变量:
类变量在所有实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 -
实例变量:
在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。 -
数据成员:
类变量或者实例变量用于处理类及其实例对象的相关的数据。 -
方法重写:
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。 -
局部变量:
定义在方法中的变量,只作用于当前实例的类。 -
继承:
即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类。 -
实例化:
创建一个类的实例,类的具体对象。 -
对象:
通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
示例
说了这么多,还是一头雾水,下面我们举一个简单例子解释上面一些关键名词的意思,
语法如下
语法格式如下:
class ClassName:
<statement-1>
.
.
.
<statement-N>
举例如下
class MyClass:
"""一个简单的类实例"""
i = 12345
def function(self):
d = 12345
return 'hello world'
这个示例中,类的名字就是Myclass。在类中定义了一个方法“function”该方法作用就是返回一个字符串‘hello world’;在该方法中还定义了局部变量d。在该类中定义了一个类变量i,该类变量可以由类名直接调用(Myclass.i)。
- [ ]