用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 应该封装与特定概念或目的相关的所有功能(例如您的 A
和 B
,但也像您的 X
和 Y
).
我相信你想多了。您可能知道如何使用 classes,而 mixin 实际上只是 classes,它们被赋予了一个奇特的名字,因为它们需要多重继承才能工作。 (因为 mixins 并不总是完整的 classes 能够独立运行;它们是可以附加到其他 classes 的功能的集合。)类 是关于关注点分离的.一个问题 - 一个 class。为 A
、B
、X
和 Y
这 4 个概念中的每一个实现一个 class,然后按照您认为合适的方式组合它们(具有多重继承) .
强烈建议阅读What is a mixin, and why are they useful?。 (当前)评分最高的答案很好地解释了 mixins 恰好在这种情况下存在。
我正在重构一些可重用性不高且有相当多重复代码的代码。该代码有两个 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 应该封装与特定概念或目的相关的所有功能(例如您的 A
和 B
,但也像您的 X
和 Y
).
我相信你想多了。您可能知道如何使用 classes,而 mixin 实际上只是 classes,它们被赋予了一个奇特的名字,因为它们需要多重继承才能工作。 (因为 mixins 并不总是完整的 classes 能够独立运行;它们是可以附加到其他 classes 的功能的集合。)类 是关于关注点分离的.一个问题 - 一个 class。为 A
、B
、X
和 Y
这 4 个概念中的每一个实现一个 class,然后按照您认为合适的方式组合它们(具有多重继承) .
强烈建议阅读What is a mixin, and why are they useful?。 (当前)评分最高的答案很好地解释了 mixins 恰好在这种情况下存在。