【问题标题】:Proper use of mixins in python在python中正确使用mixin
【发布时间】:2012-03-06 21:50:58
【问题描述】:

假设 A、B 和 C 是类。 C 继承自 A 和 B,从而将它们用作 mixins。

此时,A 可以通过 self.whatever 访问 B 和 C 上的任何属性。 B 可以通过 self.whatever 访问 A 和 C 上的任何属性。而 C 可以通过 self.whatever 访问 A 和 B 上的任何属性。

在python中使用这种“混合”模式时,有哪些好的文章,或者是否有共识,哪些应该“知道”如何与其他人交互?例如,C 是否应该只使用 A/B 中的功能,反之则不行?还是应该 A/B 只使用 C 上的功能而不是反之?

EDIT - 这是我从另一位作者那里继承的代码。解释是在 python 中使用 mixin 模式时,这是可以接受的设计。你们确认不是。正如我在下面的评论中提到的,我永远不会以这种方式进行面向对象的设计,我将重构代码。我对可能存在一些我不理解的“mixin”模式持开放态度,因此提出了这个问题。也感谢投反对票。

【问题讨论】:

  • 您似乎对 Python 中的类如何工作感到非常困惑。您的类之间访问的示例没有真正意义。
  • “混合”在 Python 中不存在(作为一种句法结构;该模式可以在代码中实现)。这是直接继承。
  • @Marcin,我上面提到的确实在技术上有效。这不是我编写的代码,我试图为作者提供一些怀疑的好处,因为 Python 中使用了我似乎不理解的 mixin 模式。在我使用的其他面向对象技术中,我上面列出的某些部分在技术上甚至是不可能的,即使它们是,这将是可怕的面向对象设计。我将重构代码以使其理顺。

标签: python inheritance mixins


【解决方案1】:

A 可以自己实例化吗?如果可以,它一定不能依赖于 C。C 上的 B 同上。作为概括,可实例化的类应该只依赖于自身及其超类,而不是子类。

这可能存在例外情况,超类可能需要了解其子类,但这可能表明设计不佳,因为(通常是不希望的)耦合。

【讨论】:

  • 更糟糕的是,如果B 依赖于A 的功能,就像问题中所建议的那样。这两个类没有任何共同点,它们通过一个公共子类进行连接纯属巧合。
  • 完全同意。在我正在查看的代码库中,A、B 和 C 真的可以被定义为一个类。他们分开的唯一原因是为了避免一个庞大的文件。 A 和 B 被认为是由 C 继承的 mixin。在一些基础上,A 和 B 相互依赖,就像你说的那样,这感觉是错误的。甚至比 A 和 B 更错误,这取决于被子类化并在其子类中使用功能。这是奇怪的设计,我会重构它。
  • 为了回答您的问题,代码作者从未打算将 A 自己实例化。
猜你喜欢
  • 2016-08-21
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2012-10-12
相关资源
最近更新 更多