微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个名为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.但是你可能不需要那样做.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐