我有一个名为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): ...
一方面,第一种方法是更多的succint,并确保你不能尝试使用WithIndexing而不使用WithAutoNumbering.另一方面,我总是阅读(并且发现它同意)混合不应该具有层次结构,即仅从对象继承,以避免整个类层次结构的碎化与不可理解的__mro__s
解决方法
选择mixins继承的是你的选择会影响使用这些mixin的类的最终MRO.
should
WithIndexing
inherit from WithAutoNumbering
正如你所说,WithIndexing使用WithAutoNumbering.这是一个有趣的课程,根本不能单独使用;并且通过继承WithAutoNumbering,WithIndexing可以覆盖WithAutoNumbering成员.
通常,每个级别更容易覆盖上面找到的方法,您将其设置为单个继承的次数越多.
但是,如果你选择设计另一种方式(这样你需要从两者继承以使一个类能够使用WithIndexing),你可能会完全没问题,直到覆盖WithAutoNumbering中找到的方法.在这种情况下,类在基本列表中出现的顺序可能会影响它们的MRO顺序,在这种情况下,您可能会得到令人惊讶的结果.如果你需要以这种方式影响MRO的力量,你应该让每个mixin继承自object.但是你可能不需要那样做.