关于python:多继承,给两个父级的构造函数一个参数

multiple inheritance, give both parents' constructors an argument

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

我在Python2.7中有以下情况:

1
2
3
4
5
6
7
8
9
10
11
class A(object):
     def __init__(self, a):
           self._a = a

class B(object):
     def __init__(self, b):
           self._b = b

class C(A, B):
     def __init__(self):
           # How to init A with 'foo' and B with 'bar'?

还应该注意的是,父类(比如A)中的一个是库类,解决方案最好假设它设置在Stone中;而另一个B类是我的,可以自由更改。

正确初始化两个父类的正确方法是什么?谢谢!


颠倒继承顺序,让您的类在库1上调用super

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In [1375]: class A(object):
      ...:      def __init__(self, a):
      ...:            self._a = a
      ...:
      ...: class B(object):
      ...:      def __init__(self, b, a):
      ...:            self._b = b
      ...:            super().__init__(a)
      ...:
      ...: class C(B, A):
      ...:      def __init__(self):
      ...:          super().__init__('bar', 'foo')
      ...:          

In [1376]: c = C()

In [1377]: c._a
Out[1377]: 'foo'

In [1378]: c._b
Out[1378]: 'bar'

基本思想是修改超类以接受两个参数,一个参数本身,另一个参数将被传递到MRO之后。

另外,您可以在python 3中删除来自object的继承。

编辑:

python 2需要带参数的super调用:

1
2
3
4
5
6
7
8
class B(object):
    def __init__(self, b, a):
        self._b = b
        super(B, self).__init__(a)

class C(B, A):
    def __init__(self):
        super(C, self).__init__('bar', 'foo')