关于python super的用法疑问

power0811 2012-11-18 03:33:10

#!/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的. 麻烦讲下原理 多谢
...全文
212 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2012-11-19
  • 打赏
  • 举报
回复
同时调用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()
power0811 2012-11-18
  • 打赏
  • 举报
回复
我的意思是 为什么输出结果是这样的 D __init__ B __init__ A __init__ leave B leave D B不是继承了A和C么, 而且C也是继承object的, 可为什么 print 'C __init__'这个没有被打印出来
libralibra 2012-11-18
  • 打赏
  • 举报
回复
为了检验基类搜索顺序,你可以做下面的试验
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()的基类为止
libralibra 2012-11-18
  • 打赏
  • 举报
回复
关于这个请看python之父Guido van Rossum的这篇博文:Method Resolution Order 你这个这个D类的搜索路径为:D,B,A,C, 所以super(D).__init__()找到基类A.__init__()后会直接调用,并返回,

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧