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

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

参考文章三篇

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

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 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://my.oschina.net/mypeng/blog/2050454

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值