1、什么是继承
-
继承是一种新建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类
-
在python中,一个子类可以继承多个父类
其他语言中,一个子类只能继承一个父类
2、继承的作用
- 减少代码的冗余
3、如何实现继承
- 先确定谁是子类,谁是父类
class ParentClass1: # 定义父类
pass
class ParentClass2: # 定义父类
pass
class SubClass1(ParentClass1): # 单继承,基类是ParentClass1,派生类是SubClass
pass
class SubClass2(ParentClass1, ParentClass2): # python支持多继承,用逗号分隔开多个继承的类
pass
4、查看所有继承的父类
print(Person.__bases__)
#__base __
只查看从左到右继承的第一个父类,__bases__
则是查看所有继承的父类
如果没有指定父类,python会默认继承object类,object是所有python的父类。
经典类:在python2中,class Dad: 不会继承object,这样的类叫做经典类(它叫经典类,不是因为它经典,而是因为它比较老)
新式类:在python3中,python会默认继承object类(一切皆对象)
class Dad 就相当于python2中的 class Dad(object) #新式类
而且python3中没有经典类了
5.继承与抽象(先抽象后继承)
抽象:抽取类似或者说比较像的部分(也就是提取一类事物的特点,范围越来越大,共性越来越少)
是从大范围到小范围的过程
继承:是基于抽象的过程,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构
是从小范围到大范围的过程
6.派生:(相对论)
1.在父类的基础上产生子类,产生的子类就叫做派生类
2.父类里没有的方法,在子类中有了,这样的方法就叫做派生方法。
3.父类里有,子类也有的方法,就叫做方法的重写(就是把父类里的方法重写了)
7.注意的几个概念:
1.子类可以使用父类的所有属性和方法
2.如果子类有自己的方法,就执行自己的;如果子类没有自己的方法,就会找父类的。
3.如果子类里面没有找到,父类里也没有找到,就会报错
4.如果子类中实现了调用父类的方法
在类内:super(子类,self).方法名() supper().__init__
(参数)
在类外:super(子类名,对象名).方法名()
8、super
子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法。
问题: 子类重写父类的__init__
导致代码更加冗余
解决问题: 子类重用父类的属性,并派生出新的属性。
两种方式:
1.直接引用父类的__init__
为其传参,并添加子类的属性。
2.通过super来指向父类的属性。
super()是一个特殊的类,调用super得到一个对象,该对象指向父类的名称空间。
注意: 使用哪一种都可以,但不能两种方式混合使用。
方式一:
方式一:
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyTeacher(OldboyPeople):
def __init__(self, name, age, sex, sal):
OldboyPeople.__init__(self, name, age, sex)
self.sal = sal
方式二:
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyTeacher(OldboyPeople):
def __init__(self, name, age, sex, sal):
# super() ---> 特殊的对象 ---> 对象.属性 ---> 父类的名称空间
# 会将调用类传入的对象当做第一个参数传给__init__()
super().__init__(name, age, sex)
self.sal = sal
class TTT:
def __init__(self) -> None:
self.a = '333'
class GGG(TTT):
def __init__(self) -> None:
super(GGG, self).__init__() # super(GGG,self) 首先找到 GGG 的父类(就是类 TTT),然后把类 GGG 的对象转换为类 TTT 的对象
def t(self):
print(self.a)
run = GGG()
run.t()
用mro返回的是一个继承序列;(了解知识点)
super的继承顺序严格遵循mro继承序列
9、钻石继承
新式类:广度优先,横着找
经典类:深度优先:从上到下找