我有两个类,它们的__init__
方法初始化了相同的参数。 我想继承类"X"中的两个类。但我会得到:TypeError: B.__init__() missing 1 required positional argument: 'my_param'
可重现的示例:
class A:
def __init__(self, my_param):
super().__init__()
self.my_param = my_param
class B:
def __init__(self, my_param):
super().__init__()
self.my_param = my_param * 2
class X(A, B):
def __init__(self, my_param):
super().__init__(my_param=my_param)
a = X(my_param=1)
print(a.my_param)
A和B是Mixins,它们为子类提供了额外的功能。它们可以单独使用或一起使用。假设类 A 提供按 ID 搜索的 searhc 功能,其中类 B 提供按值搜索。
有没有办法为 A 和 B 中的每一个设置my_param或设置它而不会出错?
这不能只使用super()
调用来完成,因为链中最后一个类的超类将被object
,它不接受my_param
参数。
有关将参数传递给具有多重继承__init__()
方法的更多讨论,请参阅 python 使用超级将参数传递给构造函数。
因此,您需要更改X
以显式调用超类 init 方法,而不是使用super()
。A
和B
不应该称呼super().__init__()
,因为它们是object
的子类,在其__init__()
中没有任何作用。
class A:
def __init__(self, my_param):
self.my_param = my_param
class B:
def __init__(self, my_param):
self.my_param = my_param * 2
class X(A, B):
def __init__(self, my_param):
A.__init__(self, my_param=my_param)
B.__init__(self, my_param=my_param)
由于A
和B
共享相同的字段,我认为使一个从另一个继承是有意义的 - 在这种情况下,B
从A
继承。这样,您只需要在类X
中从B
进行子类化。
例如:
class A:
def __init__(self, my_param):
self.my_param = my_param
class B(A):
def __init__(self, my_param):
super().__init__(my_param * 2)
# or:
# A.__init__(self, my_param * 2)
class X(B):
def __init__(self, my_param):
super().__init__(my_param=my_param)
a = X(my_param=1)
print(a.my_param) # 2