Python 多重继承 super().__init__().



我有两个类,它们的__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()AB不应该称呼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)

由于AB共享相同的字段,我认为使一个从另一个继承是有意义的 - 在这种情况下,BA继承。这样,您只需要在类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

最新更新