python ABC 与多重继承

问题描述 投票:0回答:1

我想知道是否可以在Python中使用抽象基类的多重继承。看起来应该是可能的,但无法以某种方式找到声明。

基本 ABC 示例:


from abc import ABC, abstractmethod


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC):
    pass


child = Child()

这将失败,因为“hello”没有在“Child”中实现。

我想知道如何将ABC与多重继承结合起来。我想让“BaseABC”或“Child”也从其他一些单独的类继承。明确:


from abc import ABC, abstractmethod


class BaseABC(ABC, dict):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC):
    pass


child = Child()

这不会像第一种情况那样以预期的方式失败。另外:


from abc import ABC, abstractmethod


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC, dict):
    pass


child = Child()

这也不会失败。我怎样才能要求“Child”实现“hello”?

python multiple-inheritance abc
1个回答
6
投票

问题在于从字典继承,这些人可能更好地解释了这一点:

据我了解,内置的列表、字典和集合类型为了性能而内嵌了大量代码。本质上,他们在许多不同的函数之间复制粘贴相同的代码,以避免额外的函数调用并使事情变得更快一点。

我没有在网上找到任何参考资料来解释为什么做出这个决定以及这个选择的替代方案的后果是什么。但我主要相信这样做是为了我作为 Python 开发人员的利益。如果 dict 和 list 不能以这种方式更快,为什么核心开发人员会选择这种奇怪的实现?

之所以会出现这种情况,是因为Python内置的dict是在C上实现的,并且其方法之间是相互独立的。我猜这是为了性能而做的。

因此,根据您想要对子类字典执行的操作,您可以按照https://stackoverflow.com/a/3387975/14536215中的建议使用MutableMapping或使用UserDict(这是MutableMapping)如:

from abc import ABC, abstractmethod
from collections import UserDict


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass

class Child(BaseABC, UserDict):
    pass


child = Child()
© www.soinside.com 2019 - 2024. All rights reserved.