Python: 在多重继承中调用多个初始化
Python: Calling multiple inits in Multiple inheritance
我有 2 个 classes:A(需要 1 个参数来初始化)和 B(需要 2 个参数来初始化),第三个 class 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)
当我运行上面的代码时,最后一行有错误; class A 的 __init__
被调用,而不是 class 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
如何从 class C 的 __init__
调用 A 和 B 的 __init__
函数?
编辑:我在 Debian Linux 上使用 Python 3.5.3,但我更喜欢同时适用于 Python2 和 Python3 的解决方案。
调用 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
假设您可以控制 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)
我有 2 个 classes:A(需要 1 个参数来初始化)和 B(需要 2 个参数来初始化),第三个 class 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)
当我运行上面的代码时,最后一行有错误; class A 的 __init__
被调用,而不是 class 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
如何从 class C 的 __init__
调用 A 和 B 的 __init__
函数?
编辑:我在 Debian Linux 上使用 Python 3.5.3,但我更喜欢同时适用于 Python2 和 Python3 的解决方案。
调用 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
假设您可以控制 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)