python mixin类应该只从object继承吗?

2024-04-25 18:53:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为WithAutoNumbering的混合类,用于需要给定属性的特殊编号的类。从中我有一个很好的类组合,叫做WithIndexing,用于那些需要索引功能的类。。。它需要WithAutoNumbering的功能。在

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

两难的是,WithIndexing是否应该继承{}?或者每个需要WithIndexing的类也应该从WithAutoNumbering继承?在

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

class WithAutoNumbering(object):
    ...

class WithIndexing(WithAutoNumbering):
    ...

class CoolClass(WithIndexing):
    ...

或者这个

^{pr2}$

一方面,第一种方法更简洁,并确保不能在没有WithAutoNumbering的情况下使用WithIndexing。另一方面,我一直读到(并且发现这是令人愉快的)mix-in不应该有层次结构,即只从object继承,以避免整个类层次结构与不可理解的__mro__分片


Tags: 方法功能属性object层次结构情况编号class
2条回答

选择mixin继承自什么的问题是,您的选择将影响使用这些mixin的类的最终MRO。在

should WithIndexing inherit from WithAutoNumbering

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

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

但是,如果您选择另一种方式进行设计(这样您就需要从这两种方式继承来使一个类能够使用WithIndexing),那么您可能会完全正常,直到有东西覆盖了WithAutoNumbering中找到的方法。在这种情况下,类在基列表中的出现顺序可能会影响MRO的顺序,在这种情况下,您可能会得到令人惊讶的结果。如果您需要这样的能力来影响MRO,那么应该让这些mixin从object继承。不过,你可能不需要这个。在

Liskov substitution principle适用。设计为使用WithAutoNumbering的类是否会转而使用WithIndexing(无论它是否实际使用或需要WithIndexing添加的内容)?如果不是,那么WithIndexing应该只扩展object。在

相关问题 更多 >