面向对象的概念
面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
早期的计算机编程是基于面向过程的方法,例如实现算术运算1+1+2 = 4,通过设计一个算法就可以解决当时的问题。
随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。
面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法。面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。
1、面向对象的优点
通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。
面向对象能有效提高编程的效率,通过封装技术、消息机制可以像搭积木的一样快速开发出一个全新的系统。且面向对象的程序设计更易维护、易复用、易扩展。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
2、“面向过程”和“面向对象”的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
1、通过实例来理解面向过程与面向对象
例如五子棋,
面向过程的设计思路:
就是首先分析问题的步骤,
1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
面向对象的设计思路:整个五子棋问题可以分为:
1、黑白双方,这两方的行为是一模一样的,
2、棋盘系统,负责绘制画面,
3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
理解:明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
面向对象语言的一些基本特征
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
方法:类中定义的函数。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量,用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例如,Dog是一种Animal)。
实例化:创建一个类的实例,类的具体对象。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
Python语言的面向对象
和其它编程语言相比,Python在尽可能不增加新的语法和语义的情况下加入了类机制。
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
例如,我们有一个C++的定义类的例子:
其在Python中可以写成:
其中,self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。不过self 不是 Python 关键字,我们只是按照惯例将类的实例命名为self。
C++类的成员函数分为静态成员函数和普通成员函数(先不考虑访问限定)。通过类名可以直接访问静态的成员(变量和函数),但是不能访问普通的成员和函数,普通的函数和成员是属于对象的需要this指针才能调用,而类名是没有的。
对于Python,是没有静态非静态的概念的,Python的类当中定义的函数,通过实例调用就是实例的方法,通过类名调用就是一个函数。函数和方法不是一个类型。方法是被实例对象调用的,会被默认传入一个对象本身的引用给self参数,而通过类名调用的是从属于类的函数对象,这个函数在被调用的时候需要显示的传入实例对象作为参数。这两种调用的方式产生的结果是一样的。x.f() 等价于 MyClass.f(x)。
Python当中类是一个抽象的对象,实例是类对象。Python当中一切皆对象所以类本身也是对象,C++当中类可以是一段抽象的代码段,这里类就并不是对象,而是一个作用域。通过这个作用域只能访问到静态的信息。Python当中的类就是一个抽象对象,它描述整个类的抽象信息。
— — — — — — E N D — — — — — —