一、OOP(面向对象程序设计)
面向对象OOP(Object Oriented Programing)是软件开发方法。面向对象地概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互世界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程艺术发展到一定阶段后的产物。
以Python为例,Python是一种面向对象的编程语言,但是Python与C++一样,还支持面向过程的程序设计。在Python中完成可以使用函数,模块等方式来完成工作。担当使用Python编写一个较为庞大的项目时,则应该考虑使用面向对象的方法,以便更好地对项目进行管理。
二、Python中的面向对象的思想
面向对象程序设计是从20世纪90年代开始流行的一种编程方法,强调对象的“抽象”、“封装”、“继承”、“多态”。面向对象程序设计方法的基本思想是将任何事物都当作对象、是其所属对象类的一个实例。对于复杂的对象则将其划分成为简单的对象。由这些简单的对象以某种方式组合而形成复杂的对象。每一个对象都有其相对应的对象类。属于同一对象类的对象具有相同的属性以及操作方法等。
对象以对象类的形式将其内部的数据或者方法封装。对象与对象之间只是相互传递数据,而不能访问其他对象的内部。对象的内部相对于其他对象来说是不可见的。不同的对象类之间可以通过继承的形式来同有其他对象的属性个方法等,而形成父子关系。面向对象程序设计方法的基本过程如下。
- 确定对象及其属性和方法等
- 分析对象之间的联系确定其通信机制
- 将具有相同特征的对象抽象为对象类
- 设计、实现类,并确定类相互间的继承关系
- 创建对象实例,实现对象间的相互联系
三、类和对象
类是面向对象程序设计的基础。类具有抽象性、封装性、继承性和多态性。
- 类的抽象性是指类是对具有相同方法和属性的一类对象的描述
- 类的封装是指类将属性和方法封装,对于外部其是不可见的,只有通过类提供的接口才能与属于类的实例对象进行信息交换
- 类的继承性是指类可以由已有的类派生。派生出来的类拥有父类的方法和属性等
- 类的多态性是指类可以根据不同的参数类型调用不同的方法。同一个方法可以处理不同类型的参数。实际上python的内部已经很好地实现了多态。在python中使用类不需要考虑太多不同类型数据之间的处理
每个类都具有自己的属性和方法。类的属性实际上就是类的内部变量。而类的方法,则是在类内部定义的函数。对象是具体的事物,是实例化后的类。每个对象的属性值可能不一样,但所有由同一类实例化得来的对象都拥有共同的属性和方法。在程序中由类实例化生成对象,然后使用对象的方法进行操作,完成任务。一个类可以实例化生成多个对象。
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
四、类的基础
1、类的定义
在python中类的定义与函数的定义类似,不同的是,类的定义使用关键字“class”。与函数定义相同,在定义类的时候也要使用缩进以表示缩进的语句属于该类。
class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体
类的帮助信息可以通过ClassName.__doc__查看。class_sutie由类成员,方法,数据属性组成。与函数定义相同,使用类之前必须先定义类。类的定义一般放在脚本的头部。类定义之后就产生了一个名字空间,与函数类似。在类内部使用的属性,相当于函数中的变量名,还可以在类的外部继续使用。类的内部与函数的内部一样,相当于一个局部作用域。不同类的内部也可以使用相同的属性名。
实例:
class Student: '一个学生的基类' def __init__(self, name ,age): self.name = name self.age = age def show(self): print("姓名:", self.name) print("年龄:", self.age)
这是一个学生的基类,由该基类可以实例化多个学生对象。第一个是构造方法,被称类的构造函数或者初始化方法,当创建了这个类的实例就会调用该方法。self代表类的实例,self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。self代表类的实例,而非类。类在定义之后必须先实例化才能使用。类的实例化与函数的调用相似,只要使用类名加圆括号的形式就可以实例化一个类。类的实例化之后会产生一个对象。一个类可以实例化多个对象,对象与对象之间并不相互影响。类实例化以后可以使用其属性和方法等。定义一个学生的基类,然后实例化两个对象的例子如下:
2、类的属性和方法
类的属性实际上是类内部的变量。每一个类都具有自己的属性和方法。属性和方法是面向对象程序设计所独有的概念。属性是类所封装的数据,而方法则是类对数据进行的操作。使用"."来访问对象的属性。
class Student: '一个学生的基类' def __init__(self, name, age): self.name = name self.age = age def show(self): print("名字:", self.name) print("年龄:", self.age) if __name__ == "__main__": A = Student("王明", 19) B = Student("张三", 20) print(A.name)
你也可以添加,删除,修改类的属性
a.grade = "8年级" a.grade = "9年级" del a.grade
![](https://img2018.cnblogs.com/blog/1632445/201910/1632445-20191006113203411-623036188.png)
3、内置属性
- __dict__:类的属性(包含一个字典,由类的数据属性组成)
- __doc__:类的文档字符串
- __name__:类名
- __module__:类定义所在的模块(类的全名是’__main__.className‘,如果类位于一个导入模块mymod中,那么classNmae.__module__等于mymod)
- __bases__:类的所有父类构成元素(包含了一个由所有父类组成的元组)
4、类的继承
面向对象的变成所带来的好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或者派生类,被继承的类称为基类,父类或者超类。继承语法:
class 派生类名(基类名): ...
在python中继承的一些特点:
- 如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。
- 在调用基类的方法是,需要加上基类的类名前缀,且需要带上self参数变量。区别在于类中调用普通函数时并不需要带上self参数
- python总是查找对应类型的方法,如果它不能再派生类中找到对应的方法,它才开始到基类中逐个查找(从左到右查找)
如果在继承元组中列了一个以上的类,那么它就被称作“多继承”。