python 混合类应该只从对象继承吗?

bgu*_*ach 5 python inheritance multiple-inheritance mixins

我有一个混合WithAutoNumbering类,用于需要给定属性的特殊编号的类。除此之外,我有一个很好的类混合调用,WithIndexing用于需要索引功能的那些类......需要WithAutoNumbering.

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

困境是,应该WithIndexing继承自WithAutoNumbering?或者每个需要的类也WithIndexing应该继承自WithAutoNumbering?

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

class WithAutoNumbering(object):
    ...

class WithIndexing(WithAutoNumbering):
    ...

class CoolClass(WithIndexing):
    ...
Run Code Online (Sandbox Code Playgroud)

或这个

class WithAutoNumbering(object):
    ...

class WithIndexing(object):
    ...

class CoolClass(WithIndexing, WithAutoNumbering):
    ...
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*cin 1

选择 mixins 继承的问题是,你的选择将影响使用这些 mixin 的类的最终 MRO。

应该WithIndexing继承自WithAutoNumbering

正如你所说,WithIndexing使用WithAutoNumbering. 这是一种有趣的类,根本不能单独使用;并且通过继承自WithAutoNumbering, WithIndexing可以覆盖WithAutoNumbering成员。

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

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