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

时间:2018-09-23 16:31:11

标签: python oop mixins abstract-methods

我正在重构一些不太可重用的代码,并且有很多重复的代码。该代码有两个类A和B,它们扩展了抽象类I。但是有A和B的子类来支持概念X和Y,因此结果是复制并粘贴了概念X和Y的具体类AX,AY,BX,BY进入每个。

所以我知道我可以在这里使用合成来委派对功能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

1 个答案:

答案 0 :(得分:1)

是的,这正是存在mixin(或更一般而言,类)的目的。一个类应该封装与特定概念或目的相关联的所有功能(例如您的AB,也喜欢您的XY)。

我相信您对此有过多的思考。您可能知道如何使用类,mixin实际上只是被赋予了奇特名称的类,因为它们需要多重继承才能起作用。 (因为mixin并不总是能够独立运行的完整类;它们是可以附加到其他类的功能的集合。)类是有关关注点分离的。一关-一堂课。为这四个概念ABXY中的每个实现一个类,然后根据需要将它们组合(具有多个继承)。

我强烈建议您阅读What is a mixin, and why are they useful?。 (当前)最高评分的答案很好地说明了混合素确实存在于此类情况。