我有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: ",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的__init__.
A: rcd value: 1
Traceback (most recent call last):
File "inheritance.py",line 20,in <module>
c = C(1,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: ",b2val)
self.b1val = b1val
self.b2val = b2val
super().__init__(**kwargs)
然后C .__ init__只需要调用一次super:
class C(A,**kwargs):
super().__init__(aval=aval,b1val=b1val,b2val=b2val,**kwargs)
c = C(1,3)