我有一个名为WithAutoNumbering
的混合类,用于需要给定属性的特殊编号的类。从中我有一个很好的类组合,叫做WithIndexing
,用于那些需要索引功能的类。。。它需要WithAutoNumbering
的功能。在
有些类需要编号,但不需要索引,因此将它们混合在一起不是一个好主意。在
两难的是,WithIndexing
是否应该继承{WithIndexing
的类也应该从WithAutoNumbering
继承?在
即,CoolClass
是必须实现索引的一个:
class WithAutoNumbering(object):
...
class WithIndexing(WithAutoNumbering):
...
class CoolClass(WithIndexing):
...
或者这个
^{pr2}$一方面,第一种方法更简洁,并确保不能在没有WithAutoNumbering
的情况下使用WithIndexing
。另一方面,我一直读到(并且发现这是令人愉快的)mix-in不应该有层次结构,即只从object
继承,以避免整个类层次结构与不可理解的__mro__
分片
选择mixin继承自什么的问题是,您的选择将影响使用这些mixin的类的最终MRO。在
正如您所说,
WithIndexing
使用WithAutoNumbering
。它是一种有趣的类,根本不能单独使用;并且通过继承WithAutoNumbering
,WithIndexing
可以覆盖WithAutoNumbering
成员。在一般来说,越是将其设置为单个继承,每个级别都将更容易覆盖上面找到的方法。在
但是,如果您选择另一种方式进行设计(这样您就需要从这两种方式继承来使一个类能够使用
WithIndexing
),那么您可能会完全正常,直到有东西覆盖了WithAutoNumbering
中找到的方法。在这种情况下,类在基列表中的出现顺序可能会影响MRO的顺序,在这种情况下,您可能会得到令人惊讶的结果。如果您需要这样的能力来影响MRO,那么应该让这些mixin从object继承。不过,你可能不需要这个。在Liskov substitution principle适用。设计为使用
WithAutoNumbering
的类是否会转而使用WithIndexing
(无论它是否实际使用或需要WithIndexing
添加的内容)?如果不是,那么WithIndexing
应该只扩展object
。在相关问题 更多 >
编程相关推荐