上一篇内容我们详细了解了Python使用inspect模块获取一个模块、类、实例、函数的信息及帮助文档的方法(参见新手入门到进阶,你不可不知的模块,用Python获取对象的详细信息)。

前情提要

今天,我们继续领略inspect模块的一些高级用法——使用inspect模块获取一个类的层次结构和类的继承顺序。

准备好了吗?马上开始

无聊的文档

以下是文档官方描述,文档恐惧的小伙伴慎入,不喜欢读文档的小伙伴可跳过直接看例子学习

inspect.getclasstree(classes, unique=False)

该函数文档中的解释是:Arrange the given list of classes into a hierarchy of nested lists,翻译过来就是将给定的类列表排列成嵌套列表的层次结构。

在出现嵌套列表的地方,它包含从紧靠列表前面的类派生的类,返回的每个条目都是一个2元组,包含一个类及其基类的元组。这是讲了返回值

参数“unique”默认为False,如果为True,则给定列表中每个类的返回结构中只会出现一个条目。否则,使用多重继承的类及其子代将多次出现。这里讲参数

怎么样?是不是很复杂,其实它就是根据一个给定的类或者基类,创建一个类似树的数据结构,返回列表中,各个元素可能是一个包含类及其基类的元组,也可能是另一个包含子类元组的列表。

好乏味

上面讲了一串东西,很无聊,不是吗?

再简单点理解,就是用它可以知道类的层次结构和继承顺序。

对着一个简单的例子来理解下,千万别走开哦……

定义示例类

举个例子

首先定义四个相互继承的类A、B、C、D

class A(object):

pass

class B(A):

pass

class C(B):

pass

class D(C, A):

pass

获取类的层次结构

例子中继承顺序是这样的:B继承自A,C又继承自B,D有两个父类C、A

我们使用上面的方法看下类A、B、C、D的层次结构。

怎样的层次结构?

import inspect

from pprint import pprint

pprint(inspect.getclasstree([A,B,C,D]))

>>>

[(, ()),

[(, (,)),

[(, (,)),

[(, (,)),

[(, (, ))]],

(, (, ))]]]

好吧,貌似把本来不算复杂的问题被我们搞复杂了

但它确实打印出来了类的层次结构。我们定义一个函数,将上面的结果处理下

把上面的内容整理一下

def print_class_tree(tree, indent=-1):

if isinstance(tree, list):

for node in tree:

print(print_class_tree(node, indent + 1))

else:

print("\t" * indent + tree[0].__name__)

return ""

然后来看下编译器中返回的结果

PyCharm中运行结果

成功获取类的层次结构。然后我们使用参数unique=True看下结果。

设置unique为True时运行结果

可以看出,子类D对于A的继承没有显示出来,但这样貌似更加直观。但它的代价是减少了部分继承内容。

多重继承的顺序

我们知道,对于一个多重继承的类(有多个父类),如果其父类中都定义了一个重名方法,那么,子类使用哪个父类的同名方法呢?这就牵扯到继承顺序的问题?

有两种方法

方法一:使用类名.__mro__或者直接使用类名.mro()方法获取

print(D.mro()) 或者print(D.__mro__)

>>>(, , , , )

其实,细心的小伙伴肯定能发现,D.mro()返回的是个列表list类型,而D.__mro__返回的则是个元组tuple类型。

方法二:使用inspect.getmro()方法获取,示例如下:

print(inspect.getmro(D))

>>>(, , , , )

结果完全相同,使用inspect.getmro(D)方法等同于D.__mro__。

获得清晰的继承关系

为什么不让它更直观一点呢?

对于这个问题,直接遍历元组,获取逐个获取类名即可解决

for item in inspect.getmro(D):

print("{}".format(item.__name__))

输出结果如下

>>>

D

C

B

A

object

清晰反映了类的继承顺序。

好了,今天的内容就到这里了,喜欢的小伙伴们点个赞呗!

对于Python类的继承顺序,到底是“深度优先”还是“广度优先”,欢迎大家留言讨论。

转载请注明出处,百家号:Python高手养成

python顺序结构有一个入口_高楼万丈平地起,基础要打牢!Python获取类的层次结构和继承顺序...相关推荐

  1. python顺序结构实验设计_实验二 顺序结构程序设计

    实验二 顺序结构程序设计(验证性实验)(二学时) Python 程序设计 实验报告 班级_物流192_________ 姓名_吴陈燕_________ 学号_3190505219__________成 ...

  2. python顺序结构实验设计_实验二 顺序结构程序设计(验证性实验)

    安徽工程大学 Python程序设计实验报告 班级物流192 姓名 徐敏 学号 3190505232 成绩 _____ 日期 2020.3.22 指导老师 修宇 [实验名称] 实验二 顺序结构程序设计( ...

  3. python顺序结构教学设计_初中Python程序设计-顺序结构-教学设计方案

    教学设计方案-<顺序结构程序设计> 一.教学目标 ( 1 )知识与技能 ①能够根据问题分析,设计顺序结构程序的算法 ②能够运用顺序结构,使用 Python 程序编写.调试并运行代码 ( 2 ...

  4. python顺序结构实验_Python程序设计实验报告二:顺序结构程序设计

    安徽工程大学 Python程序设计 实验报告 班级 物流192 姓名方伟虎学号3190505205 成绩 日期 2020.3.20 指导老师修宇 [实验名称] 实验二 顺序结构程序设计(验证性实验) ...

  5. python顺序结构实验_Python程序设计实验报告二:顺序结构程序设计(验证性实验)...

    安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名姚彩琴学号3190505129 成绩 日期 2020.3.3 指导老师修宇 [实验名称] 实验二 顺序结构程序设计(验证性实验) [ ...

  6. python顺序结构实验设计_Python程序设计实验报告二:顺序结构程序设计

    安徽工程大学 Python程序设计实验报告 班级 物流192 姓名 周立 学号 3190505227成绩 日期 3月4日 指导老师修宇 实验二 顺序结构程序设计(验证性实验) [实验目的] (1)掌握 ...

  7. python顺序结构代码_Python代码结构——顺序、分支、循环

    ## 顺序结构 - 按照从上到下的顺序,一条语句一条语句的执行,是最基本的结构 ## 分支结构 if condition: statement statement ... elif condition ...

  8. 一个完整的python文件即是一个模块_用python玩转数据|基本语法

    比较运算符 >>>3<4<7 True >>>3<4<1 False >>> 打开文件 >>> f=op ...

  9. 以下构成python循环结构的方法中_超星尔雅初级英语口语(持续更新中)选修课答案...

    套期具有"对冲""互抵"的关系 答:正确 差异化战略核心是企业在市场营销.研究和开发.产品技术和工艺设计以及服务等方面具有强大的实力. 答:正确 以下构成Pyt ...

最新文章

  1. ckeditor4.4.6添加代码高亮
  2. Redis 通用操作1
  3. Linux命令(持续更新)
  4. 用python修改文件内容修改txt内容的3种方法
  5. 初识Qt Creator
  6. 【Redis】3. Redis数据类型 Hash
  7. OpenStack核心组件-glance镜像服务
  8. html vw自动跳到ie,CSS3动画/关键帧,在IE11问题中使用vw进行转换
  9. 协同遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟
  10. linux上安装fio教程,fio工具安装及使用
  11. ZED ROS包发布topic介绍
  12. 数据结构与算法基础02:线性表
  13. 为 iOS 6 量身打造 Apps
  14. mysql mariadb 10.4_MariaDB 10.4.1发布,流行的MySQL分支版本
  15. 抓linux肉鸡教程视频,抓肉鸡的教程和软件免费分享(2018一天抓1000只电脑肉鸡视频)...
  16. 交互设计起源于计算机的人机界面设计的例子,交互设计概述.ppt
  17. 最新bilibili怎么下载视频
  18. 网站图片怎么优化搜索排名
  19. Flutter实战之go_router路由组件入门指南
  20. 【HTML5】字体加粗代码

热门文章

  1. Cannot open the disk 'E:/vmware/Ubuntu.vmdk' or one of the snapshot disks it depends on. 解决方法
  2. uart——51程序
  3. conda配置清华镜像
  4. 线性规划总结3——单纯形法和对偶单纯形法
  5. python打开文件并读取2进制_在Python中,哪些文件可以读取为文本,哪些文件可以读取为二进制?...
  6. input python_python input 详解
  7. C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝
  8. 数据结构与算法 / 贪心算法
  9. 启明云端分享| SSD212 SPI+RGB点屏参考
  10. 400W SOD-123封装 TVS管SMF4L系列 型号齐全