Python:在多重继承中调用多个inits

问题描述 投票:3回答:2

我有2个类:A(需要1个参数来初始化)和B(需要2个参数来初始化),以及第三个类C,它们来自A和B.

class A:
    def __init__(self, sval): 
        print("A: rcd value: ", sval)
        self.aval = sval

class B: 
    def __init__(self, sval, tval):
        print("B: rcd 2 values: ", sval, tval)
        self.aval=sval
        self.bval=tval

class C(A,B):
    def __init__(self, a, b, c):
        super().__init__(a) 
        super().__init__(b,c) # error here

c = C(1,2,3)

当我运行上面的代码时,最后一行有错误; A类的__init__被称为,而不是B类。

A: rcd value:  1
Traceback (most recent call last):
  File "inheritance.py", line 20, in <module>
    c = C(1,2,3)
  File "inheritance.py", line 16, in __init__
    super().__init__(b,c) 
TypeError: __init__() takes 2 positional arguments but 3 were given

如何从C类的__init__调用A和B的__init__函数?

编辑:我在Debian Linux上使用Python 3.5.3,但我更喜欢一个适用于Python2和Python3的解决方案。

python python-3.x oop python-2.x multiple-inheritance
2个回答
1
投票

让我们假设您可以控制AB,并且可以避免在两者中使用相同的属性名称。然后,为了正确使用super,请按如下方式定义它们。

class A:
    def __init__(self, aval, **kwargs): 
        print("A: rcd value: ", aval)
        self.aval = sval
        super().__init__(**kwargs)

class B: 
    def __init__(self, b1val, b2val, **kwargs):
        print("B: rcd 2 values: ", b1val, b2val)
        self.b1val = b1val
        self.b2val = b2val
        super().__init__(**kwargs)

然后C.__init__只需要拨打一次super

class C(A, B):
    def __init__(self, aval, b1val, b2val, **kwargs):
        super().__init__(aval=aval, b1val=b1val, b2val=b2val, **kwargs)

c = C(1, 2, 3)

1
投票

A.__init__()B.__init__()而不是super().__init__()

class C(A,B):
    def __init__(self, a, b, c):
        A.__init__(self, a) 
        B.__init__(self, b, c)

Python 3(https://repl.it/repls/CooperativeTransparentRobot):

class A:
    def __init__(self, sval): 
        print("A: rcd value: ", sval)
        self.aval = sval

class B: 
    def __init__(self, sval, tval):
        print("B: rcd 2 values: ", sval, tval)
        self.aval=sval
        self.bval=tval

class C(A,B):
    def __init__(self, a, b, c):
        A.__init__(self, a) 
        B.__init__(self, b,c) # this does not give error

c = C(1,2,3)

>> Python 3.6.1 (default, Dec 2015, 13:05:11)
>> [GCC 4.8.2] on linux
>> A: rcd value:  1
>> B: rcd 2 values:  2 3

也适用于Python 2:https://repl.it/repls/GreenAbleBlockchain

© www.soinside.com 2019 - 2024. All rights reserved.