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

关于python super的用法疑点

2013-01-02 
关于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的. 麻烦讲下原理 多谢
[解决办法]
关于这个请看python之父Guido van Rossum的这篇博文:Method Resolution Order 

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

[解决办法]
同时调用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()

热点排行