python面向对象
- 一、基本理论
- 二、 面向对象在python中实践
- 2.1 如何去定义类
- 2.2 通过类创建对象
- 2.3 属性相关
- 2.4 方法相关
- 三、python对象的生命周期,以及周期方法
- 3.1 概念
- 3.2 监听对象的生命周期
- 四、面向对象的三大特性
- 4.1 封装
- 4.2 继承
- 4.2.1 概念
- 4.2.1 目的
- 4.2.2 分类
- 4.2.3 type和object区分
- 4.2.4 继承下的影响
- 4.3 多态
一、基本理论
1.什么是对象?
万物皆为对象,对象是具体的事物:
1. 拥有属性
2. 拥有行为
3. 把很多零散的东西,封装为一个整体
2. python中体现:python是一门特别彻底的面向对象编程(OOP)的语言
3. 面向过程&面向对象
都是解决问题的思路
面向过程:在解决问题的时候,关注的是解决问题的每个过程(步骤)
面向对象:在解决问题的时候,关注的是解决问题所需要的对象
对比:
1. 面向对象和面向过程都是解决问题的一种方式(思想) 面向对象本身是对面向过程的封装
2. 面向过程编程最重要的是按照步骤划分,把一个任务,分解成具体的每一个步骤
3. 面向对象编程最重要的是划分不同的对象,之后去确定对象的属性和行为
4. 如何从面向过程编程思想,过渡到面向对象编程?
4.1 先列举出一个任务的具体实现的步骤
4.2 试图分离这些实现步骤的功能代码块
4.3 将这些功能代码块,划分到某一个对象中
4.4 根据整个对象以及对应的行为,抽象出对应的类
4. 类
4.1 类:某个具体对象特征的抽象
4.2 类的作用:根据抽象的类,生产具体的对象
4.3 类的组成:
名称
属性
方法
注意:
以上属性和方法,都是抽象的概念
在产生对象之后,对象才用于具体的属性值,和方法实现
对象和类的关系:对象可以抽象为类,类可以实例化对象
二、 面向对象在python中实践
2.1 如何去定义类
class 类名: pass 里面的pass表示一个空语句,为了去保证整个结构的一个完整
2.2 通过类创建对象
变量=类名() 进行实例化
2.3 属性相关
1. 属性相关
1.1 属性和变量的区别及判定依据?
区别:
1. 概念:
变量是”可以改变的量值“
属性是”属于某个对象的特性“
2. 访问权限:
变量:根据不同的位置,存在不同的访问权限
属性:只能通过对象来进行访问
判定依据:是否存在宿主
2. 对象属性
2.1 怎样让一个对象拥有一些属性?(增)
1. 直接通过对象,动态添加 对象.属性 = 值
2. 通过类的初始化方法(构造方法) __init__方法
2.2 怎样访问或者修改一个对象的属性?(查,改)
通过对象.属性来进行查询,如果之前没有就是查询,有的话就是修改
2.3 怎样删除一个对象的属性?(删)
del 对象.属性
补充:查看对象所有属性 对象.__dict__
3. 类属性
3.1 怎样让一个类拥有属性?(增)
方式1:类名.类属性 = 值
方式2:在类里面直接写上变量名
3.2 怎样让一个类拥有属性?(查)
方式1:通过类访问,类名.类属性
方式2:通过对象访问,对象.类属性
注意:通过对象访问到类属性,是和python对象的属性查找机制有关,优先到对象自身去查找属性,找到则结束;如果没有找到,则根据_class_找到对象对应的类,到这个类里面去找。
3.3 怎样让一个类拥有属性?(改)
方式1:类名.属性 = 值
方式2:对象.__class__.属性 = 值
3.4 怎样让一个类拥有属性?(删)
通过类名删除,del 类名.属性,
但是不能通过对象删除,del 语句只删除直系属性。
2.4 方法相关
1. 方法的概念:描述一个目标的行为动作。
2. 方法的划分:
2.1 实例方法 默认第一个参数需要接收到一个实例
2.2 类方法 默认第一个参数需要接收到一个类
2.3 静态方法 第一个参数啥也不默认接收
3. 实例方法
3.1 标准调用
使用实例调用实例方法, 不用手动传,解释器会自动把调用对象本身传递过去。
3.2 其他调用
1. 使用类调用
2. 间接调用
4. 类方法
4.1 标准调用
可以通过类或者用例来调用
4.2 其他调用
利用子类进行调用
5. 静态方法
既可以使用类调用或者用例调用
补充:实例属性只能通过实例,类属性的话,既可以通过实例或者类进行访问。
三、python对象的生命周期,以及周期方法
3.1 概念
生命周期:指一个对象,从诞生到消亡的过程
当一个对象被创建时,会在内存中分配相应的内存空间进行存储
当这个对象不再使用,为了节约内存,就会把这对象释放
3.2 监听对象的生命周期
1. __new__方法
当我们创建一个对象时,用于给这个对象分配内存的方法,通过拦截这个方法,可以修改对象的创建过程,比如:单例设计模式
2. __init__方法
对象创建完成之后,会调用init方法
3. __del__方法
四、面向对象的三大特性
4.1 封装
- 概念
将一些属性和相关方法封装都一个对象中,对外部隐藏内部具体实现细节。 - 好处
- 使用起来更加方便
- 保证数据的安全
- 有利于代码维护
4.2 继承
4.2.1 概念
继承:一个类“拥有”另外一个类的“资源”的方式之一。
- 拥有:并不是资源的复制,变为双份资源,而是资源的“使用权”。
- 资源:指“非私有的”属性和方法。
4.2.1 目的
继承的目的就是为了方便资源重用。
4.2.2 分类
- 单继承:仅仅继承了一个父类。
- 多继承:继承了多个父类。
4.2.3 type和object区分
4.2.4 继承下的影响
1. 资源的继承
明确:在python中,继承是指资源的使用权,所以,测试某个资源能否被继承,其实就是测试在子类当中,能不呢个访问父类中的这个资源。
结论:除了私有的属性和私有的方法,其他基本上都能继承。
2. 继承的下的影响
2.1 继承几种形态
单继承链
无重叠的多继承链
有重叠的多继承链
2.2 几种形态应该遵循的标准规则
2.2.1 单继承
遵循“从上到下的原则”,自己身上没有这个资源,就到父类里面去找,父类再没有,再往上走。
2.2.2 无重叠的多继承
按照继承的先后次序,优先调用左侧继承链上的属性或者方法.
2.2.3 有重叠的多继承
遵循“从上到下的原则”。
2.3 资源的覆盖(属性和方法)
在MRO的资源检索链当中,优先级比较高的类写了一个和优先级比较低的类一样的一个资源(属性或方法),到时候,再去获取相关资源,就会优先选择优先级比较高的资源,而摒弃优先级比较低的资源,造成“覆盖”的假象
4.3 多态
多态:一个类,所延伸的多种形态。
调用时多种形态:在继承的前提下,使用不同的子类,调用父类的同一个方法,产生不同的功能。