gpt4 book ai didi

Python:如何创建一个继承自其他 ABC 的 ABC?

转载 作者:行者123 更新时间:2023-12-04 08:19:50 28 4
gpt4 key购买 nike

我正在尝试创建一个简单的抽象基类 Abstract它和它自己的方法一起提供了另外两个抽象基类的方法:PublisherSubscriber .当我尝试初始化具体类时 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()

最佳答案

抽象类不一定要有 abc.ABC在他们的基地列表中。他们必须有abc.ABCMeta (或后代)作为它们的元类,并且它们必须至少有一个抽象方法(或其他重要的东西,如抽象属性),否则它们将被视为具体的。 ( Publisher 没有抽象方法,所以它实际上是具体的。)
继承自 ABC只是一种获取方式 ABCMeta作为你的类的元类,对于比元类更习惯继承的人来说,但这不是唯一的方法。您也可以使用 ABCMeta 从另一个类继承作为其元类,或指定 metaclass=ABCMeta明确地。

在您的情况下,继承自 PublisherSubscriber将已经设置 Abstract的元类到 ABCMeta ,因此继承自 ABC是多余的。删除 ABC来自 Abstract的基类列表,一切都应该工作。
或者,如果您真的想要 ABC在那里出于某种原因,您可以将其移动到基类列表的末尾,这将解决 MRO 冲突 - 将其放在首位表示您想要 ABC方法来覆盖其他类的方法,这与其他类是 ABC 的子类这一事实相冲突。 .

关于Python:如何创建一个继承自其他 ABC 的 ABC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65548460/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com