python-继承

目录

 

一.继承特征

1、什么是继承

2.继承中的子类和父类的概念

3、继承的作用

二.基本方法

1.查看继承的父类 _bases_

2.方法的复写

3.super(父类)

6.__init__方法

7.派生属性

三.多继承

格式

继承原理(钻石继承)

四.抽象类

1.定义抽象类

2.定义抽象方法


一.继承特征

1、什么是继承

继承就是让类和类之间产生父子关系,子类可以拥有父类的静态属性和方法。

[继承就是可以获取另外一个类中的静态属性和普通方法。(并非所有成员)]

在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。

注意:python中的继承分为:单继承和多继承。

2.继承中的子类和父类的概念

父类:用于被继承的类,称之为父类,也叫做基类,或者超类。

子类:继承其他类的类,称之为子类,也叫做派生类。

3、继承的作用

就是提高代码的重用率

简单的继承例子

python-继承_第1张图片

python-继承_第2张图片

二.基本方法

1.查看继承的父类 _bases_

注意:

(1).python3中如果一个类没有继承任何类,默认继承object类。我们管这种类叫做新式类。

(2).object类,是python中的祖宗,所有的类都是从object类中继承下来的。

python-继承_第3张图片

2.方法的复写

子类中定义了和父类中相同的方法,我们叫做方法的复写(派生方法)。实例对象调用此方法 的时候就会调用自己类中的方法了。

python-继承_第4张图片

我们再来举个例子

python-继承_第5张图片

3.super(父类)

子类和父类有相同的方法,如果子类想调用父类相同的的方法。可以使用super()方法。

在python3中,子类执行父类的方法也可以直接用super方法 --->super()

super默认省略了两个参数 第一个参数是类名,第二个参数是self。两个参数可以省略不传递例如 super(Student,self)

super()还可以从类的外部使用 需要传递类名(本类的名称)和对象名

例如 super(Student,student)

格式:

 

父类类名.方法名称(self) 或者 super().方法名称()或者super(本类类名,对象名)

 

举个例子:

python-继承_第6张图片

6.__init__方法

 - 子类继承父类,如果子类不复写父类的__init__()方法,

   创建子类对象的时候会自动调用父类__init__()方法。

 - 子类继承父类,如果子类复习了父类的__init__()方法,

   创建的子类对象的时候不会再调用父类的__init__() 方法。

 - 注意:python要求复习父类的__init__()方法时,需要调用父类的__init__()

   因为存在隐患,例如父类的初始化方法有参数,子类初始化无参数,子类再调用父类

 

python-继承_第7张图片

7.派生属性

属性的覆盖(派生属性):子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了(属性的覆盖)。

python-继承_第8张图片

三.多继承

一个子类可以继承多个父类,就是多继承,并且拥有所有父类的属性和方法。
例如 孩子会继承自己的父亲和母亲的特征。

格式

class 子类名(父类名1,父类名2…) : pass

当我们同时继承两个父类时:

python-继承_第9张图片

 

基本正常,当我们继承的父类方法一样时,系统该如何选择呢?

我们先看一个方法

python-继承_第10张图片

这样,我们就知道当继承的类中方法一样时继承成谁了

python-继承_第11张图片

这种多继承时我们应该尽量避免这种情况的发生,即继承的多个类拥有一样的函数或者变量名

继承原理(钻石继承)

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

1.子类会先于父类被检查

2.多个父类会根据它们在列表中的顺序被检查

3.如果对下一个类存在两个合法的选择,选择第一个父类

这样和我们的逻辑思维是不太同的

python-继承_第12张图片

我们来举个例子

python-继承_第13张图片

 

四.抽象类

之前我们定义了Person类实现了eat()、drink()方法,

每种人都会吃喝但是吃喝的地点不同,如果实现了方法体就浪费了。因此我们可以只定义eat()方法,不实现方法体,这种形式我们可以将方法定义为抽象方法,具有抽象方法的类就叫做抽象类。

抽象类是一个特殊的类,只能被继承,不能实例化,抽象类中可以有抽象方法和普通方法。

1.定义抽象类

定义抽象类需要导入 abc模块。from abc import ABCMeta, abstractmethod

python-继承_第14张图片

2.定义抽象方法

抽象方法:只定义方法,不具体实现方法体。

在定义抽象方法时需要在前面加入:@abstractmethod

抽象方法不包含任何可实现的代码,因此其函数体通常使用pass。

注意:子类继承了抽象类父类,子类必须实现父类的抽象方法。

 

python-继承_第15张图片

当有了之后

python-继承_第16张图片

你可能感兴趣的:(python,python)