首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

关于python super的用法疑义

2012-12-15 
关于python super的用法疑问#!/usr/bin/python# -*- coding: utf-8 -*-class A(object):def __init__(self

关于python super的用法疑问


#!/usr/bin/python
# -*- coding: utf-8 -*-

class A(object):
    def __init__(self):
        print 'A __init__'
        pass

class C(object):
    def __init__(self):
        print 'C __init__'
        pass

class B(A,C):
    def __init__(self):
        print 'B __init__'
        super(B, self).__init__()
        print 'leave B'

class D(B):
    def __init__(self):
        print 'D __init__'
        super(D, self).__init__()
        print 'leave D'

if __name__ == '__main__':
    D()

运行之后, B命名继承了A和C两个类, 可为什么再调用D的时候, B只调用了A类的构造函数, 而不调用C的. 麻烦讲下原理 多谢
[最优解释]
同时调用A和C初始函数的话,初始函数里要都带super...
class A(object):
    def __init__(self):
        print 'A __init__'
        super(A, self).__init__()
        print 'leave A'
        
class C(object):
    def __init__(self):
        print 'C __init__'
        super(C, self).__init__()
        print 'leave C'
         
class B(A,C):
    def __init__(self):
        print 'B __init__'
        super(B, self).__init__()
        print 'leave B'
 
class D(B):
    def __init__(self):
        print 'D __init__'
        super(D, self).__init__()
        print 'leave D'
 
if __name__ == '__main__':
    D()

[其他解释]
关于这个请看python之父Guido van Rossum的这篇博文:Method Resolution Order 

你这个这个D类的搜索路径为:D,B,A,C,
所以super(D).__init__()找到基类A.__init__()后会直接调用,并返回,

[其他解释]
为了检验基类搜索顺序,你可以做下面的试验
class A(object):
    def __init__(self):
        print 'A __init__'
        pass
    def test(self):
        print 'A.test()'
 
class C(object):
    def __init__(self):
        print 'C __init__'


        pass
    def test(self):
        print 'C.test'
 
class B(A,C):
    def __init__(self):
        print 'B __init__'
        super(B, self).__init__()
        print 'leave B'      
    def test(self):
        print 'B.test()'
 
class D(B):
    def __init__(self):
        print 'D __init__'
        super(D, self).__init__()
        print 'leave D'
 
if __name__ == '__main__':
    d = D()
    print
    d.test()


1.直接运行,打印B.test()
2.注释掉B类的test方法,打印A.test()
3.继续注释掉A类的test方法,打印C.test()
可见D的super()方法的基类搜索顺序是B,A,C,调用test()方法时,是deep first搜索,直到找到包含test()的基类为止
[其他解释]
我的意思是 为什么输出结果是这样的 
D __init__
B __init__
A __init__
leave B
leave D

B不是继承了A和C么, 而且C也是继承object的, 可为什么 print 'C __init__'这个没有被打印出来

热点排行