加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 17:37:36 所属栏目:Python 来源:网络整理
导读:我有2个类:A(需要1个参数进行初始化)和B(需要2个参数进行初始化),以及第三个类C,它从A和B派生. class A: def __init__(self,sval): print("A: rcd value: ",sval) self.aval = svalclass B: def __init__(self,sval,tval): print("B: rcd 2 values: ",tval)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读