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)
不过,实际上,您应该重新设计 Abc1
和 Abc2
以更好地支持协作多重继承。通常,您可以通过 *args
and/or **kwargs
并在进行自己的设置之前或之后调用 super().__init__(*args, **kwargs)
来实现。
我正在尝试让以下内容起作用:
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)
不过,实际上,您应该重新设计 Abc1
和 Abc2
以更好地支持协作多重继承。通常,您可以通过 *args
and/or **kwargs
并在进行自己的设置之前或之后调用 super().__init__(*args, **kwargs)
来实现。