Python 中的继承和组合,不好的做法?

Both Inheritance and composition in Python, bad practice?

我正在做一个项目,其中自然的方法是使用基于不同 classes 的子组件实现一个主要对象,例如由 CPU、GPU、...

组成的 PC

我从组合结构开始,其中组件具有其子系统固有的属性和功能,并且每当需要更高级别的属性时,它们都会作为参数给出。

现在,随着我添加更多功能,拥有不同类型的主要对象会很有意义,例如一个笔记本,它可以扩展 PC class,但仍然有一个 CPU,等等。目前,我正在使用一个单独的脚本,其中包含与该类型相关的所有功能。

通过对不同类型的主对象使用子 classes,将继承和组合结合起来会被认为是不好的做法吗?

简而言之

优先使用组合而不是继承并不排除继承,也不会自动使两者的结合成为一种不好的做法。这是关于做出明智的决定。

更多详情

推荐composition over inheritance is a rule of thumb. It was 。如果您阅读他们的完整论证,您会发现这不是关于组合好而继承坏的问题;就是组合更灵活,因此在很多情况下更合适。

但您需要根据具体情况来决定。事实上,如果你考虑 composite pattern 的一些变体,叶和复合 类 的特化在某些情况下是完全合理的:

  • 多态性可以避免很多ifcases,
  • 在某些情况下,组合可能需要额外的 call-forwarding 开销,当它真正涉及类型专业化时,这些开销可能不是必需的。
  • 组合和继承的组合可以得到两全其美(注意:如果不小心应用,它也可能两全其美)

注意:如果您使用 UML 图提供上下文的简短概述,则可以在您的特定上下文中提供更多参数。同时,这个question on SE,也可能是有趣的