概述python和java中的继承之间的差异

时间:2011-09-10 12:44:43

标签: java python inheritance multiple-inheritance

我有java背景,我正在学习python。我需要尽快使用继承,并且我想知道在每个事件中如何完成任务之间的任何关键差异。我在网上看了一下,发现了一些关于两者之间的差异以及要注意什么的信息,我发现python支持多重继承,但我想知道继承特有的任何其他差异。我不需要被告知语法(除非有一些我真正需要注意的东西),我已经看了它,我会很好。

Python is not Java
Python classes: Multiple Inheritance
Python for Java programmers

我无法确切地找到我正在寻找的内容,这是对差异的概述以及需要注意的事项。

2 个答案:

答案 0 :(得分:4)

Java有一个相当简单的继承模型:类必须有一个(且只有一个)父类。虽然可以实现多个接口,但是不能从多个父级继承,这可以被视为Java的“多重继承”版本。

Java类中的大多数方法都是动态(延迟)绑定的,但父类中声明为staticprivatefinal的方法除外。

在Python中,正如您所指出的,您可以从多个(或没有)父级继承。请注意,使用多重继承,您可以获得“diamond problem”。你应该知道Python如何解决这个问题以及你在Python中引用父类时的含义(即:你的父亲是谁?)

在Python中,一切都是动态绑定的,并且由于您可以向实例添加成员,因此并非所有同一类的实例都保证具有相同的成员。

最后,构造函数被覆盖的方式略有不同:在Java中,子类必须调用父的构造函数(细化覆盖),而在Python中,子类可以覆盖构造函数而不调用parent的构造函数(替换覆盖)。

答案 1 :(得分:2)

来自java背景时要掌握的最重要的概念是类继承是很少需要在python中解决问题的工具。这个想法的流行语是 duck typing

大多数python程序正在访问和调用on或object上的属性。与在java中一样,您可以通过提供一个函数来获得有用的行为,该函数期望一种类型的对象成为另一种更精细类型的对象。为了在java中工作,需要替换的对象继承预期的类型,或实现预期的接口。

在python中,根本没有必要;如果替换对象具有您要传递给它的函数的所有属性,那么它将起作用。

在python中实现继承的唯一原因是因为超类真的,几乎所有你需要新类型的事情都做了,你只需添加一些额外的行为。

最丰富的例子是python中的迭代器协议。具有返回对象本身的方法__iter__()的任何对象和返回任何内容的next()方法都是迭代器,并且可以显示for语句。 strlistdictfile和许多其他类型,它们没有多少共同点,只有全局object作为公共超类,每个实现迭代器协议。