Python:如何创建从其他ABC继承的ABC?
我试图创建一个简单的抽象基类Python:如何创建从其他ABC继承的ABC?,python,abstract-class,multiple-inheritance,Python,Abstract Class,Multiple Inheritance,我试图创建一个简单的抽象基类abstract,它与自己的方法一起提供了另外两个抽象基类的方法:Publisher和Subscriber。当我尝试初始化基于Abstract构建的具体类concrete时,我得到一个错误:无法为基本ABC、发布者、订阅者创建一致的方法解析顺序(MRO)。正确的方法是什么 from abc import ABC, abstractmethod class Publisher(ABC): subscribers = set() d
abstract
,它与自己的方法一起提供了另外两个抽象基类的方法:Publisher
和Subscriber
。当我尝试初始化基于Abstract
构建的具体类concrete
时,我得到一个错误:无法为基本ABC、发布者、订阅者创建一致的方法解析顺序(MRO)。正确的方法是什么
from abc import ABC, abstractmethod
class Publisher(ABC):
subscribers = set()
def register(self, obj):
self.subscribers.add(obj)
def unregister(self, obj):
self.subscribers.remove(obj)
def dispatch(self, event):
print("dispatching", event)
class Subscriber(ABC):
@abstractmethod
def handle_event(self, event):
raise NotImplementedError
class Abstract(ABC, Publisher, Subscriber):
@abstractmethod
def do_something(self, event):
raise NotImplementedError
class Concrete(Abstract):
def handle_event(self, event):
print("handle_event")
def do_something(self, event):
print("do_something")
c = Concrete()
对此进行更改:
类摘要(ABC、出版商、订阅者):
为此:
类摘要(发布者、订阅者):
这两个子类已经是抽象的,因此您不需要再次从
ABC
继承。抽象类不必在它们的基列表中包含ABC.ABC
。它们必须有abc.ABCMeta
(或一个后代)作为元类,并且它们必须至少有一个抽象方法(或其他重要的东西,如抽象属性),否则它们将被视为具体的。(Publisher
没有抽象方法,所以它实际上是具体的。)
从ABC
继承只是将ABCMeta
作为类的元类的一种方法,对于比元类更熟悉继承的人来说,这并不是唯一的方法。您还可以从另一个类继承ABCMeta
作为其元类,或者显式指定metaclass=ABCMeta
在您的情况下,从
Publisher
和Subscriber
继承已经将Abstract
的元类设置为ABCMeta
,因此从ABC
继承是多余的。从Abstract
的基类列表中删除ABC
,一切都应该正常
或者,如果出于某种原因确实希望ABC
,可以将其移动到基类列表的末尾,这将解决MRO冲突-将其放在第一位表示希望ABC
方法覆盖其他类的方法,这与其他类是ABC的子类这一事实相冲突