文档章节

python2和python3的继承方式的不同,广度优先和深度有限

鹏灬
 鹏灬
发布于 2018/09/12 20:12
字数 1097
阅读 103
收藏 1

脚踏黄土,头顶清风,不道苦楚,莫问前程!!!


参考文章三篇

简书第一篇简书第二篇博客园的文章,这篇博客园文章讲的很好

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现

python2中经典类和新式类的继承方式不同,经典类采用深度优先搜索的继承,新式类采用的是广度优先搜索的继承方式 python3中经典类和新式类的继承方式都采用的是都采用广度优先搜索的继承方式

在Python 3.x中取消了经典类,默认都是新式类,并且不必显式的继承object,也就是说:
class Person(object):
	pass
class Person():
	pass
class Person:
	pass
三种写法并无区别,推荐第一种

但是在Python2.x中,默认都是经典类,只有显式继承了object才是新式类,即:
class Person(object):
	pass   新式类写法
class Person():
	pass 经典类写法
class Person:
	pass 经典类写法

举个例子来说明:现有4个类,A,B,C,D类,D类继承于B类和C类,B类与C类继承于A类。class D(B,C) 实例化D类

深度优先

现在构造函数的继承情况为:
若D类有构造函数,则重写所有父类的继承
若D类没有构造函数,B类有构造函数,则D类会继承B类的构造函数
若D类没有构造函数,B类也没有构造函数,则D类会继承 A类 的构造函数,而 不是C类 的构造函数(经典类继承顺序,详见下面代码)
若D类没有构造函数,B类也没有构造函数,A类也没有构造函数,则D类才会继承C类的构造函数
继承的顺序结构为D--->B----->A----->C(深入继承树左侧查找)

广度优先

现在构造函数的继承情况为:
若D类有构造函数,则重写所有父类的继承
若D类没有构造函数,B类有构造函数,则D类会继承B类的构造函数
若D类没有构造函数,B类也没有构造函数,则D类会继承 C类 的构造函数,而 不是A类 的构造函数(新式类继承顺序,详见下面代码)
若D类没有构造函数,B类也没有构造函数,C类也没有构造函数,则D类才会继承A类的构造函数
继承的顺序结构为 D---->B----->C------->A

super()方法只能用于新式类中 接下来就是super().__init__()的用法 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类

class Base(object):
	  def __init__(self):
		   print “Base init”

则普通方法如下

class Leaf(Base):
	   def __init__(self):
			  Base.__init__(self)
			  print “Leaf init”

super方法如下

class Leaf(Base):
	   def __init__(self):
			  super(Leaf, self).__init__()
			  print “Leaf init”

super不是父类,而是继承顺序的下一个类,在多重继承时会涉及继承顺序,super()相当于返回继承顺序的下一个类,而不是父类,类似于这样的功能:

def super(class_name, self):
    mro = self.__class__.mro()
    return mro[mro.index(class_name) + 1]


#mro()用来获得类的继承顺序。


例如:

class Base(object):
    def __init__(self):
        print 'Base create'
 
class childA(Base):
    def __init__(self):
        print 'enter A '
        # Base.__init__(self)
        super(childA, self).__init__()
        print 'leave A'
 
 
class childB(Base):
    def __init__(self):
        print 'enter B '
        # Base.__init__(self)
        super(childB, self).__init__()
        print 'leave B'
 
class childC(childA, childB):
    pass
 
c = childC()
print c.__class__.__mro__

#输出:

enter A 
enter B 
Base create
leave B
leave A
(<class '__main__.childC'>, <class '__main__.childA'>, <class '__main__.childB'>, <class '__main__.Base'>, <type 'object'>)

本文转载自:https://www.jianshu.com/p/6f9d99f7ad54

鹏灬
粉丝 2
博文 38
码字总数 10847
作品 0
海淀
私信 提问
Python学习:15.Python面向对象(二、继承的各种情况)

一、什么是继承 继承是一种创建类的方法,在python中,一个类可以继承来自一个或多个父。原始类称为基类或超类。 #创建父类class Parent1: class Parent2: # 继承父类,单继承class Obj1(Pa...

BD-ld-2017
2018/07/11
0
0
python分布式爬虫搜索引擎实战-2-深度优先和广度优先

深度优先和广度优先 目录: 网站的树结构 深度优先算法和实现 广度优先算法和实现 网站url树结构: 分层设计 子域名: bogbole.com 环路链接: 从首页到下面节点。 但是下面的链接节点又会有链...

天涯明月笙
2017/03/26
0
0
2019年上半年收集到的人工智能Python编程干货文章

2019年上半年收集到的人工智能Python编程干货文章 一文了解Python深拷贝与浅拷贝问题 Python广度优先查找和深度优先查找(内附python教程分享) Python基础之函数2 (参数的返回值) Python...

城市中迷途小书童
06/28
0
0
理解Python中super()

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. 单继承 在单继承时,与是一样的。super()避免了基类的显式调用。代码如下: super().init() Base.init() 2. 多继承 与父类没有实质性的...

SnailTyan
03/19
0
0
Python知识点总结篇(五)

软件目录结构规范 目标: 提高可读性; 提高可维护性; 常见结构 包含内容: 项目简介 功能特性 环境依赖 部署步骤 目录结构描述 版本内容更新 常见问题说明 模块及包导入 本质是路径搜索和搜...

村雨1943
09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

教你玩转Linux—添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户...

xiangyunyan
37分钟前
6
0
返回提示信息,如:xxx创建成功!

【服务端】在输出的方法块中,加入要输出的字段(qcm_batch_id) QCMUserType.cs: public struct QCM_Custom_Create_Batch_Out_Tag { public BASCoreType.Cmn_Out_T......

_Somuns
37分钟前
6
0
Aliyun Serverless VSCode Extension v1.12.0 发布

Aliyun Serverless VSCode Extension 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件,该插件结合了函数计算 Fun 工具以及函数计算 SDK ,是一款 VSCode 图形化开发调试...

阿里云官方博客
37分钟前
6
0
程序员如何培养解决复杂问题的能力?

今天在上网时候,突然看到了这篇文章,感觉非常的适合现在的自己去思考下,可能也适用在座的读者。程序员不仅仅是敲代码,更是一个复合能力的结合体,也不仅仅停留在技术和代码阶段。你想要成...

哥本哈根的小哥
41分钟前
8
0
市场变化驱动产品思维升级

宜信科技中心财富管理产品部负责人Bob,与大家一起聊聊个性化推荐产品功能的设计和B端产品的功能策划方式。 拓展阅读:回归架构本质,重新理解微服务 智慧金融时代,大数据和AI如何为业务赋能...

宜信技术学院
41分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部