在本章第一节,介绍了面向对象程序设计的三个特征:封装、继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定,因此不存在出于多态考虑来进行继承。但继承可以让子类获得超类(也称为父类、基类,老猿习惯称父类,文中可能会有超类和父类并存的说法,老猿也没有特地去统一,还请大家见谅)的全部功能,超类实现过的方法,子类不需要重新定义就能自动拥有。因此继承还是非常重要的。

一、    语法

要指定超类,可在class语句中的类名后加上超类名,并将其用圆括号括起,具体语法如下:

class 子类名 (超类1,超类2, ...):

       #类定义部分

从上面的语法格式来看,定义子类的语法非常简单,只需在原来的类定义后增加圆括号,并在圆括号中添加多个父类,即可表明该子类继承了这些父类。

实现继承的类被称为子类,被继承的类被称为父类(也被称为基类、超类)。父类和子类的关系,是一般和特殊的关系。

从子类的角度来看,子类扩展(extend)了父类;但从父类的角度来看,父类派生(derive)出子类。也就是说,扩展和派生所描述的是同一个动作,只是观察角度不同而已

二、    类继承方法的使用

1.    子类如果要继承父类的方法(含构造方法、析构方法),可以有2种方法:

1>    继承后不重写父类方法;

2>    重写父类方法,在子类的对应方法里显式地调用父类的方法。

2.    子类如果要重新父类方法(含构造方法、析构方法),但同时还需要父类的方法,可以在子类方法里显示调用父类的方法,同时在方法中再添加其他代码;

3.    子类方法中要显示调用父类方法的三种实现方式

1>    父类名.父类方法,这种方法需要注意,self参数必须传给父类方法;

2>    super().父类方法,这种方法调用不需要也不能传递self参数,由Python自动传入;

3>    super(子类名,self).父类方法,这种方法调用也不需要传递self参数。

以上三种方法,老猿推荐大家使用第二种,一是使用简单,不需要给出父类名或子类名,也不需要self参数传递,二是程序修改简单,如果父类或子类名修改无需修改相关代码。不过这种方法只有Python3以后才支持。

三、    类继承变量的使用

1.    父类定义的实例变量和类变量可以直接继承,可以在子类方法中直接访问,与访问自身定义的实例变量和类变量方式一样;

2.    如果子类和父类的不同实例方法都对某个实例变量进行赋值,但执行的顺序不同,哪个方法先执行就认为该实例是哪个类创建的实例变量,另外一个都可以对其进行访问。极端情况下,如果一个子类的实例变量定义后,在父类的实例方法可以访问该实例变量,无需在父类实例方法中先定义。老猿认为这种能力看起来使用灵活,但不建议使用,首先是因为这不符合父类、子类的设计原则,也不符合封装的原则,其次是容易带来问题,这种方式不符合类的使用者的思维模式,容易出现问题。

四、    说明

1.    在Python3后,如果在定义一个 Python 类时并未显式指定这个类的直接父类,则这个类默认继承 object 类。因此,object 类是所有类的父类,要么是其直接父类,要么是其间接父类;

2.    Python支持多继承,多继承的子类会继承多个超类所有的属性和方法。

1)    大部分面向对象的编程语言(除了 C++)都只支持单继承,而不支持多继承,这是由于多继承不仅增加了编程的复杂度,而且很容易导致一些莫名的错误;

2)    Python 虽然在语法上明确支持多继承,但通常推荐如果不是很有必要,则尽量不要使用多继承,而是使用单继承,这样可以保证编程思路更清晰,而且可以避免很多麻烦;

3)    如果多个超类以不同的方式实现了同一个方法(即有多个同名方法),必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。

3.    一个类的基类可通过其特殊属性__bases__访问;

4.    多个超类的超类有相同方法时,查找特定方法或类变量时访问超类的顺序称为方法解析顺序(MRO),Python使用MRO算法按照类和实例属性的查找顺序去查找类变量。关于MRO算法请大家参考:https://blog.csdn.net/qq_34979346/article/details/83181353

本节介绍了Python中类中类的继承语法,以及在子类中怎么继承使用父类的变量和方法,有关内容涉及面较广,本节未举例进行说明,下节专门举例介绍。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第7.6节 Python中类的继承机制详述的更多相关文章

  1. python中类的继承

    python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...

  2. Python中类的继承代码实例

    Python中类的继承代码实例 这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下 相对于C 的继承编写,Python更简洁,而且效率也是很高的,下面编 ...

  3. 第7.8节 Python中隐秘的类封装方法

    前面章节已经介绍了Python中的多态和继承,本节将介绍面向对象程序设计OOP三大特征的另一个特征--封装. 一.    概念 封装是将对象的状态信息(也就是数据.属性)隐藏在对象内部,将对象的属性和 ...

  4. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  5. python面向对象之继承与派生

    一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...

  6. Python之面向对象继承和派生

    Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...

  7. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  8. Python中类的__init__继承

    Python中类的__init__继承 概念: 定义父类 In [10]: class Person: ....: def __init__(self,name,age,sex): ....: sel ...

  9. 第7.7节 案例详解:Python类继承机制

    本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一.    定义父类Vehicle class Vehicle():    def __ ...

随机推荐

  1. 美团笔试题_ACM最多队伍

    题目: 选择队伍参加ACM比赛,可以选择的人由N+M组成,N代表N个擅长算法的人,M代表M个擅长编程的人,选择要求:每个队伍三个人,每个队伍中至少有一个擅长算法的人,至少有一个擅长编程的人.求可以组成 ...

  2. 读 <The Lost Horizon> 感

    读它有两个契机.一是小组英语 pre 讲香格里拉,二是高二有个男生课前演讲讲过<消失的地平线>,彼时他一脸陶醉向我们描绘场景和人物.现在我只记得他 PPT 的风景图特别美.他好像去 thu ...

  3. mybatis foreach collection

    原文传递:https://blog.csdn.net/qq_24084925/article/details/53790287 foreach元素的属性主要有 item,index,collectio ...

  4. ngx ------ngx_cache_manager_process_cycle

    static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data) {----------------------- ...

  5. 主动关闭 tcp fin-wait-2 time-wait 定时器

    后面整理相关信息 //后面整理相关信息 /* * This function implements the receiving procedure of RFC 793 for * all state ...

  6. python脚本打包成rpm软件包

    前言 软件最终都会有交付的形式,有的是用tar包,有个是以目录,有的是封成一个文件包,从大多数使用场景来说,直接打包成软件包的方式是最简单,也是最不容易出错的,路径可以在包里面写死了 实践 关于打包的 ...

  7. 有关线上系统点击没有任何相应得问题思考,主要针对PC端应用程序

    1.问题得起因 前段时间,客户得某些机器上,点击应用系统得快捷方式,没有任何响应,不弹出程序主界面,也没有任何得报错提示,甚至程序得错误日志也没有任何输出. 当时,听说发生这种情况得时候,有点懵了,不 ...

  8. CSP-J 2020题解

    CSP-J 2020题解 本次考试还是很有用的,至少把我浇了一盆冷水. 当使用民间数据自测的时候,我就自闭了. 估分是320,但有些比较低级的错误直接少掉80. 而且这套题应该上350才正常吧,也不是 ...

  9. C++ const的自我理解

    C++学习笔记–const const 是 constant 的缩写,本意是不变的,不易改变的意思.在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数. C++ const ...

  10. Linux学习 - 02 使用 - Centos8 - 『更换rpm/epel包源为国内源』

    1. Centos8 - 『更换rpm/epel包源为国内源』 centos 8 默认是会读取centos.org的mirrorlist的,所以一般来说是不需要配置镜像的. 如果你的网络访问mirro ...