【发布时间】:2019-02-17 01:43:04
【问题描述】:
我有 2 个类:A(需要 1 个参数来初始化)和 B(需要 2 个参数来初始化),以及派生自 A 和 B 的第三类 C。
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-2.x和Python-3.x标签,因为您从未指定您使用的 Python 版本,并且该解决方案适用于两者 -
您有一个冲突需要解决:
A和B都有名为aval的属性;一个需要重命名。如果您无法控制A或B,那么您将不得不为其中一个定义一个适配器。 -
使用
super的正确方法是同时使用A和B,然后使用super一次 fromC.__init__。
标签: python python-3.x oop python-2.x multiple-inheritance