Nic*_*ada 6 python abstract-class multiple-inheritance
我正在尝试创建一个简单的抽象基类Abstract,它及其自己的方法提供了其他两个抽象基类的方法:Publisher和Subscriber。当我尝试初始化构建的具体类时Concrete,Abstract出现此错误:无法为基础 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()
Run Code Online (Sandbox Code Playgroud)
抽象类不必abc.ABC在其基列表中。它们必须有abc.ABCMeta(或后代)作为它们的元类,并且它们必须至少有一个抽象方法(或其他重要的东西,如抽象属性),否则它们将被视为具体的。(Publisher没有抽象方法,所以它实际上是具体的。)
对于比元类更熟悉继承的人来说,继承ABC只是获取ABCMeta类的元类的一种方法,但这不是唯一的方法。您还可以从另一个类继承作为ABCMeta其元类,或metaclass=ABCMeta显式指定。
在您的情况下,继承自Publisher并将Subscriber已将Abstract的元类设置为ABCMeta,因此继承自是ABC多余的。ABC从的基类列表中删除Abstract,一切都应该正常。
或者,如果出于某种原因您确实想要ABC在那里,您可以将其移至基类列表的末尾,这将解决 MRO 冲突 - 将其放在第一位表示您希望ABC方法覆盖其他类的方法,这与事实上,其他类都是 的子类ABC。
| 归档时间: |
|
| 查看次数: |
2408 次 |
| 最近记录: |