类的继承
- 幕布地址>>>
- 继承是什么
继承是一种关系,用来描述类和类之间的关系
例如a继承了b,a就能直接使用b已经存在的方法和属性
a称之为子类,b称之为父类,也称之为基类 - 为什么要用继承
继承的一方可以直接使用被继承一已经有的方法和属性目的是为了常用已有的飞马,提高重用性 - 如何使用继承 /语法格式
class 类名称(父类的名称): 类的内容 #在python中 一个子类可以同时继承多个父类
- 抽象
- 1.定义
将多个子类中相同的部分,进行抽取,形成一个新的类,这个过程称之为抽象的过程 - 2.如何正确使用继承
a.先抽象后继承
b.继承一个已经存在的类,扩展或是修改原始的功能
- 1.定义
- 属性的查找顺序
对象自己 --> 所在类中 --> 父类 --> 父类的父类 --> Object - 派生
- 1.定义
当一个子类中出现和父类中不同的内容时,这个子类就称之为派生类 - 2.使用场景
通常子类都要写一些新的代码,不可能与父类完全一样,既通常都是派生类,所以一般所说的派生就是子类
- 1.定义
- 覆盖
也称之为重写overrides
当子类出现了父类名称完全一致的属性或方法时,会优先使用子类里边的,所以相当于是覆盖了 - 子类 访问父类的 属性或方法 的格式
- 方式
1.super(当前类名称, self).父类属性或方法
2.super().父类的属性或方法
3.类名称.父类的属性或方法(self)
# 方式3其实就是正常的调用类中的属性或方法,与继承无关 - 重点强调
当继承了一个现有的类,并且覆盖了父类的init方法时,
必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数
“目的”:父类在初始化方法时,可能声明了一些东西,来保证类能正常使用,
子类写了init方法就表示覆盖了父类的init方法,相当这些声明就不再声明了,
所以先执行一下父类的init方法,让这些必要条件初始化一下 - 练习:实现一个可以限制元素类型的列表
class MyList(list): def __init__(self, t): super().__init__() self.t = t def Myappend(self, obj): if type(obj) == self.t: super(MyList, self).append(obj) else: print(f'wrong type,need {self.t}') m = MyList(int) m.Myappend(1) print(m[0]) m.Myappend("1") '''执行结果 1 wrong type,need <class 'int'> '''
- 方式
- 继承的原理(mro列表)
类名.mro() 可以查看当前类 查找 (属性或方法) 的顺序 - 组合
- 定义
也是一种关系,描述两个对象之间什么有什么 的关系 - 目的
也是为了重用代码 - 组合与继承异同
什么时候用继承:两个类之间是不是:什么是什么的关系
什么时候用组合:两个类之间是不是:什么有什么的关系另外组合比继承的耦合度更低
- 定义
- 菱形继承
- 新式类与经典类
新式类:任何显式或隐式地继承自object类就称为新式类,
Python3中任何类都是直接或间接地继承了Object,所以都是新式类
经典类:不是object的子类,仅在Python2中出现 - 属性查找的顺序
新式类:先深度,当遇到了共同父类时就广度
经典类:就是深度优先
- 新式类与经典类