python中多重继承的行为

时间:2012-02-13 07:13:36

标签: python class default-constructor

In [5]: class a(object):
   ...:     def __init__(self):
   ...:         print "In class a"
   ...:         self.a = 1
   ...:         
In [6]: class b(object):
   ...:     def __init__(self):
   ...:         print "In class b"
   ...:         self.b = 2
   ...:         
   ...:         

In [7]: class c(b, a):
   ...:     pass
   ...: 
In [8]: c.mro()
Out[8]: 
[<class '__main__.c'>,
 <class '__main__.b'>,
 <class '__main__.a'>,
 <type 'object'>]

In [9]: obj = c()
In class b

In [10]: obj.__dict__
Out[10]: {'b': 2}

__init__的默认c方法在obj创建时调用,该方法在内部调用仅__init__类的b

根据我的理解,如果我从2类继承,我的派生类对象应该具有来自两个类的变量(除非它们对这些类是私有的)。

我的问题:我希望我的派生对象包含两个类的变量我错了吗?如果是这样,为什么?不应该调用__init__a吗?像C ++这样的语言会发生什么?

1 个答案:

答案 0 :(得分:8)

在python中,默认情况下不调用上层的初始化方法。为此,您必须使用super显式调用它们,如下所示:

class a(object):
    def __init__(self):
        super(a, self).__init__()
        print "In class a"
        self.a = 1

class b(object):
    def __init__(self):
        super(b, self).__init__()
        print "In class b"
        self.b = 2

class c(b, a):
    pass

obj = c()

示例输出。

  

在课堂上a   在班级b

编辑:关于为什么这样做,我会说这是基于The Zen of of Python的设计决定:

  

明确比隐含更好。