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

And*_*eas -2 python inheritance multiple-inheritance

我有两个类,它们的方法初始化了相同的参数__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)
Run Code Online (Sandbox Code Playgroud)

A 和 B 是 Mixins,它们为子类提供附加功能。它们可以单独或一起使用。假设 A 类提供按 ID 搜索的 searchhc 功能,而 B 类提供按值搜索的功能。

有没有办法为 A 和 B 分别设置 my_param 或设置它而不会出现错误?

Bar*_*mar 8

仅使用调用无法完成此操作super(),因为链中最后一个类的超类将是object,它不带my_param参数。

有关将参数传递给具有多重继承的方法的更多讨论,请参阅python 多重继承使用 super 将参数传递给构造函数__init__()

因此,您需要更改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)
Run Code Online (Sandbox Code Playgroud)