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的子类这一事实相冲突