用mixins实现抽象方法可以吗?

Is it ok to use mixins to implement abstract methods?

我正在重构一些可重用性不高且有相当多重复代码的代码。该代码有两个 classes A 和 B,它们扩展了抽象 class I。但是 A 和 B 的子classes 支持概念 X 和 Y,因此结果是具体的 class将 AX、AY、BX、BY 与概念 X 和 Y 复制并粘贴到每个。

所以我知道我可以在这里使用组合来委托对功能 X 和 Y 的支持,但这也需要构建这些对象等的代码,这就是为什么我开始阅读有关 mixins 的原因,所以我想知道我的代码是否是好的解决方案

class I(ABC):
    @abstractmethod
    def doSomething():
        pass

class ICommon(ABC):
    @abstractmethod
    def doSomethingCommon():
        pass

class A(I, ICommon): 
    # the interface(s) illustrates what mixins are supported 
    # class B could be similar, but not necessarily with the same interfaces
    def doSomething():
        self.doSomethingCommon()
        ...

class XCommonMixin(object): 
    # feature X shared possibly in A and B
    # I have also split features X into much smaller concise parts, 
    # so the could be a few of these mixins to implement the different 
    # features of X
    def doSomethingCommon():
        return 42

class AX(XCommonMixin, A):
    pass 
    # init can be defined to construct A and bases if any as appropriate

是的,这正是 mixins(或者更一般地说,classes)存在的目的。 class 应该封装与特定概念或目的相关的所有功能(例如您的 AB,但也像您的 XY ).

我相信你想多了。您可能知道如何使用 classes,而 mixin 实际上只是 classes,它们被赋予了一个奇特的名字,因为它们需要多重继承才能工作。 (因为 mixins 并不总是完整的 classes 能够独立运行;它们是可以附加到其他 classes 的功能的集合。)类 是关于关注点分离的.一个问题 - 一个 class。为 ABXY 这 4 个概念中的每一个实现一个 class,然后按照您认为合适的方式组合它们(具有多重继承) .

强烈建议阅读What is a mixin, and why are they useful?。 (当前)评分最高的答案很好地解释了 mixins 恰好在这种情况下存在。