一.继承的特性

1.什么是继承

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

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

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

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

 

 

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

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

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

 

3.继承的作用

提高代码重用率

练习1:创建Dog类和Cat类,分别设置name,gender,age属性和定义eat()、sleep()方法。

并且Dog类在定义一个bite()方法,Cat类定义climb_tree()方法。

python 基类对象是否是派生类 python基类和子类_抽象类

注意:我们发现Cat了和Dog类中有大量的重复代码。

 

2.使用继承方式,实现Dog类和Cat类重复代码的重用。

python 基类对象是否是派生类 python基类和子类_继承_02

 

4.查看继承的父类

格式:类名.__bases__

注意:

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

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

 

练习。查看Cat类和Animal类继承的父类

python 基类对象是否是派生类 python基类和子类_继承_03

 

 

5.方法的复写

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

 

练习1:定义一个Person类创建eat()方法,定义一个Student的类,创建eat()方法,

规定学生去食堂吃饭,定义一个Boss类创建eat()方法,规定Boss去酒店吃。

python 基类对象是否是派生类 python基类和子类_父类_04

 

 

6.super()

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

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

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

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

例如 super(Student,student)

格式:

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

在类的内部:

子类想调用父类的相同方法

python 基类对象是否是派生类 python基类和子类_子类_05

在类的外部调用:

python 基类对象是否是派生类 python基类和子类_子类_06

 

7.__init__()方法

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

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

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

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

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

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

   的参数的时候就会报错。

 

8.派生属性

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

python 基类对象是否是派生类 python基类和子类_子类_07

 

 

 

9.私有属性私有方法在继承中的表现

父类中的私有方法和私有属性都是不能被子类继承下来的。

python 基类对象是否是派生类 python基类和子类_子类_08

10.抽象类

9.1定义抽象类

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

python 基类对象是否是派生类 python基类和子类_继承_09

或者:

class Subject:

    __metaclass__ ABCMeta

9.2定义抽象方法

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

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

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

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

python 基类对象是否是派生类 python基类和子类_继承_10

练习:定义Animal 抽象类实现eat()和sleep()两个抽象方法,定义一个Dog()子类继承抽象类

python 基类对象是否是派生类 python基类和子类_子类_11