您的位置:首页 > 编程语言 > Python开发

Python中新式类,子类使用super方法显式调用父类的__init__方法

2014-11-30 16:18 801 查看
Python中,类自身或者其父类继承了object那么这个类就是个新式类,若没有继承object,则是经典类。

因为Python中存在多重继承,在新式类中,要查找或调用一个方法或属性时,使用的是广度优先搜索算法;而在经典类中则使用深度优先搜索算法。

看新式类中的广度优先算法,一个简单的例子,例子中把子类使用super方法显式调用父类的__init__方法也呈现:

class A(object):
def __init__(self):
self.name = 'Jeremy'

class B(A):
def __init__(self):
super(B,self).__init__()
self.name = 'Jian'

class C(B):
def __init__(self):
super(C,self).__init__()
self.name = 'Zhao'

class D(A):
def __init__(self):
super(D,self).__init__()
self.name = 'Zhao Jian'

class E(D,C,A):
def __init__(self):
super(E,self).__init__()
self.lover = 'Aimee'
print self.name + " love " + self.lover
e = E()


很明显,这段代码执行的结果如下:



因为E在查找self.name时先从D中查找,所以self.name = 'Zhao Jian'

如果把D中的self.name 注释掉,执行的结果如下:



D中没有self.name属性,按照广度优先搜索,查找的应该是C中self.name属性,所以得到的结果是self.name = 'Zhao'

如果再把C中的self.name属性注释掉,那么应该查找A中的self.name属性,但是因为B继承了A,所以应该先查找B中的self.name属性

所以执行结果如下:



使用super方法来调用父类的__init__方法只有在新式类中才可以这样做
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息