Python:在多重继承中呼叫多个init

前端之家收集整理的这篇文章主要介绍了Python:在多重继承中呼叫多个init 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有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)

猜你在找的Python相关文章