【问题标题】:Is it ok to use mixins to implement abstract methods?使用mixins实现抽象方法可以吗?
【发布时间】:2018-09-23 16:31:10
【问题描述】:

我正在重构一些不太可重用并且有很多重复代码的代码。代码有两个类 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

【问题讨论】:

  • 在 6 个月内,有人需要阅读代码(甚至是未来的你)......他们会理解吗?如果您认为他们会这样做,请继续实施您的复杂解决方案。然后在 6 个月后回来看看您是否正确。

标签: python oop mixins abstract-methods


【解决方案1】:

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

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

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

【讨论】:

  • 我可能想多了,但这是我第一次使用 mixins(并且遇到了使用它们的理由),但总是被告知多重继承是邪恶的,我试图确保我这样做对;)我想我的问题与我读过的东西主要不同,因为我使用混合来实现从抽象类中调用的抽象钩子,而不是像大多数示例中那样使用“公共”方法添加区域功能.这有什么改变吗?
  • @ovg 不。您的每个类都实现了一组功能。这些特性是否在父类中被声明为抽象并不重要。类是代码重用的工具。您完全按照预期使用它们。
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2018-07-12
  • 2014-02-17
  • 2018-12-16
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多