【问题标题】:python ABC & Multiple Inheritancepython ABC & 多重继承
【发布时间】:2021-05-16 07:00:01
【问题描述】:

我想知道是否可以在 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()

这也不会失败。我怎样才能要求“孩子”来实现“你好”?

【问题讨论】:

    标签: python multiple-inheritance abc


    【解决方案1】:

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

    因此,根据您想对子类 dict 做什么,您可以按照 https://stackoverflow.com/a/3387975/14536215 中的建议使用 MutableMappingUserDict(这是 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()
    

    【讨论】:

    • 也许我在链接上错过了它,但我找不到任何解释为什么从 dict 继承会阻止实现抽象方法的要求?
    • 你希望字典是类本地的还是像静态变量一样被类共享
    • 感谢 Tzane。好的,似乎我选择了一个不好的案例,我认为 dict 足够通用。似乎适用于我自己的自定义类,希望它适用于我在实践中需要的类!
    • @tbjorch 我认为没有明确说明为什么这不起作用,但是两个来源都引用了 dict 的后端实现(listset)以某种方式制作“静态”以获得更好的性能。
    猜你喜欢
    • 2015-05-02
    • 2020-12-16
    • 2020-12-18
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2016-02-25
    相关资源
    最近更新 更多