昨日回顾
1、面向对象
是一种编程思想 核心就是对象
将程序看做一堆对象的集合 程序的功能就是控制调度对象来交互完成
2、为什么使用面向对象
优点 扩展性高 灵活性 重用性、
缺点 程序结构更加复杂 无法预知执行结果
3、类 和对象
类是一系列具备相同特征和行为的对象的集合体 是一种抽象概念
对象 是具备某些特征和行为的集合体 是具体存在的某个事物
类包含多个对象
对象属于某个类型
4、定义
5、属性的正确使用
对象公共的部分放到类中
每个对象独有的放在对象自己的名称空间中
属性的增删改查
6、初始化函数
用来给对象附初始值 和一些别的初始化逻辑
不能返回值 只能返回none
7、绑定方法
对象和函数 对象的绑定方法
当使用对象调用时 会自动传入对象本身作为第一个参数
当使用类调用时 那就是普通函数需要自己传值
类和函数 类的绑定方法
用类或对象调用会传入类本身
@classme
8、非绑定方法
场景
当函数的逻辑中需要访问对象时 那就绑定给对象 仅需要类中数据就绑定给类
属性的查找顺序 先找对象自己的名称空间 找不到在找类的名称空间 类找不到他的父类。
今日内容
oop的三大特征之一
封装 继承 多态
继承
什么是继承
继承是一种关系 通过继承关系,继承的一方可以直接使用被继承一方已经有的东西,被继承的一方称之为父,继承的一方称之为子。
在python3中创建类时必然继承另一个类 如果没有显示指定父类,则默认继承object;object是跟类 所有类都直接或间接的继承object。
为什么要使用继承
1、减少代码重复 提高重用性
2、为多态提供必要的支持
在程序中 ,继承描述的就是类和类之间的关系
语法
class 类名称(父类的名称):
类的内容
#在python中 一个子类可以继承多个父类
抽象与继承(先抽象再继承):
什么是抽象
将多个子类中相同的部分 进行抽取,形成一个新的类 这个过程也称之为抽象过程。
查找顺序
先找对象自己的----所在类中----找父类----父类的父类----Object
抽象的使用场景
继承是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。
抽象只是分析和设计的过程,一个动作或者说一个技巧,通过抽象可以得到的类
派生
当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类
通常子类都会写一些新的代码 不可能和父类完全一样 即通常都是派生类
所以派生类指的就是子类
覆盖
当子类出现了与子类与父类名称完全一致的属性或是方法
练习 实现一个可以限制元素类型的容器(字典 列表 元祖 集合 字符串)
子类中访问父类的内容
语法
方式一:
super(当前类名称,self).你要调的父类的属性或方法
方式二:
super().你要调的父亲的属性或方法
方式三:
类名称.你要调的父类的属性或方法(self)
方式三与继承无关
强调
当你继承一个现有的类 并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数
组合
也就一种关系 描述两种对象之间是什么 有什么的关系
将一个对象作为另一个对象的属性 即什么有什么
组合的目的
也就是为了重用现有的代码
什么时候使用继承分析两个类的关系 到底是不是 什么是什么的关系
什么时候使用组合 如果两个类之间没有什么太大关系 完全不属于同类
另外组合相比继承 耦合度更低了
菱形继承
首先明确python支持多继承
补充 新式类与经典类
python3中任何类都是直接或者间接的继承Object
新式类 任何显式或隐式地继承自Object的类就称之为新式类 python3中全都是新式类
经典类 既不是Object的子类 仅在python2中出现
当出现了菱形继承时,新式类,先深度,当遇到共同父类时就广度
新式类 就是深度优先