Abstract class with multiple inheritance error: Can't instantiate abstract class ... with abstract method

Abstract class with multiple inheritance error: Can't instantiate abstract class ... with abstract method

我正在尝试让以下内容起作用:

from abc import ABC, abstractmethod


class Abc1(ABC):

    def __init__(self, example_variable_1: int) -> None:
        self.example_variable_1 = example_variable_1


class Abc2(ABC):

    def __init__(self, example_variable_2: int) -> None:
        self.example_variable_2 = example_variable_2

    @abstractmethod
    def example_method(self):
        pass


class Abc3(Abc1, Abc2, ABC):

    def __init__(self, example_variable_1: int, example_variable_2: int):
        Abc1(self).__init__(example_variable_1)
        Abc2(self).__init__(example_variable_2)

    @abstractmethod
    def example_method(self):
        pass


class InstantiateMe(Abc3):
    
    def __init__(self, example_variable_1: int, example_variable_2: int):
        super().__init__(example_variable_1, example_variable_2)

    def example_method(self):
        print("example_method ran")


instance = InstantiateMe(1, 2)

但是,我收到错误消息:

TypeError: Can't instantiate abstract class Abc2 with abstract method example_method`

我已经阅读了有关此主题的所有问题,它们似乎都可以通过添加缺失的 abstractmethod 或调整 MRO 来回答。我 认为 我已经把这两个都覆盖了所以很难过。

问题出在 Abc3.__init__,您调用 Abc1(self)Abc2(self) 的地方。第二个是给你错误的原因,因为不允许创建 Abc2 的实例(并且第一个不会做你想做的,即使它在技术上是合法的,因为 Abc1没有任何抽象方法)。你可能想要做的是:

Abc1.__init__(self, example_variable_1)
Abc2.__init__(self, example_variable_2)

不过,实际上,您应该重新设计 Abc1Abc2 以更好地支持协作多重继承。通常,您可以通过 *args and/or **kwargs 并在进行自己的设置之前或之后调用 super().__init__(*args, **kwargs) 来实现。