我有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的解决方案。
让我们假设您可以控制A
和B
,并且可以避免在两者中使用相同的属性名称。然后,为了正确使用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)
叫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