我有java背景,我正在学习python。我需要尽快使用继承,并且我想知道在每个事件中如何完成任务之间的任何关键差异。我在网上看了一下,发现了一些关于两者之间的差异以及要注意什么的信息,我发现python支持多重继承,但我想知道继承特有的任何其他差异。我不需要被告知语法(除非有一些我真正需要注意的东西),我已经看了它,我会很好。
Python is not Java
Python classes: Multiple Inheritance
Python for Java programmers
我无法确切地找到我正在寻找的内容,这是对差异的概述以及需要注意的事项。
答案 0 :(得分:4)
Java有一个相当简单的继承模型:类必须有一个(且只有一个)父类。虽然可以实现多个接口,但是不能从多个父级继承,这可以被视为Java的“多重继承”版本。
Java类中的大多数方法都是动态(延迟)绑定的,但父类中声明为static
,private
和final
的方法除外。
在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
语句。 str
,list
,dict
,file
和许多其他类型,它们没有多少共同点,只有全局object
作为公共超类,每个实现迭代器协议。