Python中的多重继承与组合
我对面向对象编程(OOP)和Java中的相关概念有很好的理解。
现在我在用Python编程,遇到了一种情况,觉得多重继承可能会很有用。不过(这可能是因为我在Java中写了很多年代码),我对使用多重继承有些犹豫,考虑用组合的方式来代替继承,以避免可能出现的同名方法冲突。
我的问题是,我是不是对这件事要求太严格,或者太受Java影响了?在Python中使用多重继承不仅可行,还被鼓励吗?
谢谢你的时间 :)
2 个回答
3
我还是更喜欢用组合而不是继承,不管是单继承还是多继承。深入理解鸭子类型(duck typing)就像到处都有很多隐式接口,这样在Python中你根本不太需要继承(或者抽象类)。不过这只是说我更喜欢组合,并不是说绝对不使用继承。如果继承(即使是多继承)适合你的情况,而组合又不合适,那就用继承吧。
7
关于“继承和组合”的问题,主要是为了找到一种可以重复使用代码的方法。我们不希望代码中到处都是重复的部分,因为那样不够整洁,也不高效。继承通过创建一种机制,让你可以在基础类中隐含一些特性,从而解决了这个问题。而组合则是通过提供模块和调用其他类中的函数的能力来解决这个问题。
既然这两种方法都能解决代码重复使用的问题,那在什么情况下该用哪种呢?这个答案其实很主观,但我可以给你三个建议,帮助你判断该用哪种:
- 尽量避免多重继承,因为它太复杂,难以可靠地使用。如果你不得不使用多重继承,那就要准备好了解类的层次结构,并花时间去找出每个部分的来源。
- 使用组合来把代码打包成模块,这些模块可以在很多不同的、不相关的地方和情况下使用。
- 只有在有明显相关的可重用代码,并且这些代码可以归入一个共同的概念时,才使用继承;或者是因为你使用的某个东西必须这样做。
不过,不要完全依赖这些规则。记住,面向对象编程完全是一种程序员创造的社会约定,用来打包和共享代码。因为这是一个社会约定,虽然在Python中有明确的规定,但你可能需要根据你同事的使用方式来调整自己的做法。在这种情况下,了解他们是怎么使用的,然后适应这种情况就可以了。
更多细节可以在这里找到:http://learnpythonthehardway.org/book/ex44.html