【问题标题】:Should python mix-in classes inherit only from object?python 混合类应该只从对象继承吗?
【发布时间】:2014-09-23 15:21:43
【问题描述】:

我有一个名为WithAutoNumbering 的混合类,用于需要对给定属性进行特殊编号的类。除此之外,对于那些需要索引功能的类,我有一个名为 WithIndexing 的不错的类混合......它需要 WithAutoNumbering 的功能。

有些类需要编号但不需要索引,因此将它们混合在一起并不是一个好主意。

难题是,应该WithIndexing 继承自WithAutoNumbering 还是每个需要WithIndexing 的类也应该继承自WithAutoNumbering

即这个,CoolClass 是必须实现索引的:

class WithAutoNumbering(object):
    ...

class WithIndexing(WithAutoNumbering):
    ...

class CoolClass(WithIndexing):
    ...

或者这个

class WithAutoNumbering(object):
    ...

class WithIndexing(object):
    ...

class CoolClass(WithIndexing, WithAutoNumbering):
    ...

一方面,第一种方法更简洁,并确保您不能尝试使用WithIndexing 而没有WithAutoNumbering。另一方面,我一直读到(并且觉得它很受欢迎)mix-ins 不应该有层次结构,即只从object 继承,以避免整个类层次结构的意大利面条化与无法理解的__mro__s

【问题讨论】:

  • 这个问题可能更适合programmers.stackexchange.com
  • @ColonelThirtyTwo 当然不是。这是一个技术问题。
  • @Marcin 真的吗? OP 似乎在问“哪个是更好的设计选择?”这不是programmers.se的主要话题之一吗?
  • @ColonelThirtyTwo 不,他们在问如何在python中设计这个。应用面向对象设计的宗教概念会严重误导。
  • @Marcin 这个问题肯定适用于任何其他带有 mixins 的语言?它似乎不是特定于 python 的。

标签: python inheritance multiple-inheritance mixins


【解决方案1】:

Liskov substitution principle 适用。设计为与WithAutoNumbering 一起使用的类是否可以与WithIndexing 一起使用(无论它是否实际使用或需要WithIndexing 添加的任何内容)?如果不是,那么WithIndexing 应该只是扩展object

【讨论】:

    【解决方案2】:

    选择你的 mixin 从什么继承的问题是你的选择会影响使用这些 mixin 的类的最终 MRO。

    WithIndexing 是否应该从 WithAutoNumbering 继承

    正如你所说,WithIndexing 使用 WithAutoNumbering。这是一种完全不能单独使用的有趣的类;通过从WithAutoNumbering 继承,WithIndexing 可以覆盖WithAutoNumbering 成员。

    一般来说,每个级别覆盖上面找到的方法会更容易,您将其设置为单继承越多。

    但是,如果您选择以其他方式设计(例如,您需要从两者继承以使类能够使用 WithIndexing),您可能会完全没问题,直到某些东西覆盖了 @987654328 中的方法@。在这种情况下,类出现在基本列表中的顺序可能会影响它们的 MRO 顺序,在这种情况下,您可能会得到令人惊讶的结果。如果你需要以这种方式影响 MRO 的能力,你应该让这些 mixin 中的每一个都继承自 object。不过,您可能不需要那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多