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
选择 mixins 继承的问题是,你的选择将影响使用这些 mixin 的类的最终 MRO。
应该
WithIndexing继承自WithAutoNumbering
正如你所说,WithIndexing使用WithAutoNumbering. 这是一种有趣的类,根本不能单独使用;并且通过继承自WithAutoNumbering, WithIndexing可以覆盖WithAutoNumbering成员。
一般来说,将其设置为单一继承越多,每个级别就越容易覆盖上面找到的方法。
但是,如果您选择以其他方式设计(例如,您需要从两者继承以使类能够使用WithIndexing),那么您可能会完全没问题,直到某些内容覆盖 中找到的方法WithAutoNumbering。在这种情况下,类在基本列表中出现的顺序可能会影响它们在 MRO 中的顺序,在这种情况下,您可能会得到令人惊讶的结果。如果您需要以这种方式影响 MRO 的能力,则应该让这些 mixin 中的每一个都从 object 继承。不过,您可能不需要那个。