关于python:为什么在多重继承中只调用一个class init方法

Why in Multiple Inheritance only one class init method get called

本问题已经有最佳答案,请猛点这里访问。

在模块中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo(object):
    def __init__(self):
        self.foo = 20

class Bar(object):
    def __init__(self):
        self.bar = 10

class FooBar(Foo, Bar):
    def __init__(self):
        print"foobar init"
        super(FooBar, self).__init__()
a = FooBar()
print a.foo
print a.bar

在多个继承中,只调用了第一类init方法。是否有任何方法可以调用多个继承中的所有init方法,以便访问所有类实例变量

输出:

1
2
3
4
5
6
foobar init
20
Traceback (most recent call last):
File"a.py", line 16, in <module>
    print a.bar
AttributeError: 'FooBar' object has no attribute 'bar'

无法访问bar类变量bar


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Foo(object):
def __init__(self):
    super(Foo,self).__init__()
    self.foo = 20

class Bar(object):
def __init__(self):
    super(Bar,self).__init__()
    self.bar = 10


class FooBar(Bar,Foo):
def __init__(self):
    print"foobar init"
    super(FooBar,self).__init__()



a = FooBar()
print a.foo
print a.bar

super()调用在每个步骤的mro(方法解析顺序)中查找/next方法/,这就是为什么foo和bar也必须使用它,否则执行将在bar.in it结束时停止。