Обзор различий между наследованием в Python и Java - PullRequest
4 голосов
/ 10 сентября 2011

У меня есть опыт работы в Java, и я изучаю Python. Мне скоро нужно будет использовать наследование, и я хочу выяснить, какие есть ключевые различия между тем, как все делается в каждом из них. Я посмотрел онлайн и нашел некоторую информацию о различиях между ними и о том, что нужно искать, и я обнаружил, что python поддерживает множественное наследование, но я хотел бы знать о любых других различиях, специфичных для наследования. Мне не нужно сообщать синтаксис (если только мне не нужно следить за чем-то), я уже взглянул на это, и со мной все будет в порядке.

Python не является Java
Классы Python: множественное наследование
Python для Java-программистов

Я не могу найти именно то, что я ищу, это обзор различий и на что следует обратить внимание.

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

Java имеет довольно простую модель наследования: классы должны иметь одного (и только одного) родителя. Вы не можете наследовать от нескольких родителей, хотя можете реализовать несколько интерфейсов, что можно рассматривать как версию «множественного наследования» в Java.

Большинство методов в классах Java имеют динамическую (позднюю) привязку, за исключением методов, объявленных static, private и final в родительском классе.

В Python, как вы заметили, вы можете наследовать от нескольких (или нет) родителей. Обратите внимание, что с множественным наследованием вы можете получить « проблема с бриллиантами ». Вы должны знать, как Python разрешает это и какие последствия это имеет, когда вы ссылаетесь на родительский класс в Python (то есть: кто ваш папа?)

В Python все динамически связано, и, поскольку вы можете добавлять члены к экземпляру, не все экземпляры одного и того же класса гарантированно имеют одинаковые члены.

Наконец, есть небольшая разница в переопределении конструкторов: в Java дочерние классы должны вызывать конструктор родителя (переопределение уточнения), тогда как в дочерних классах Python конструктор может переопределять и не вызывать родительский класс. конструктор (замена переопределения).

2 голосов
/ 10 сентября 2011

Самым важным понятием, которое нужно понять, если исходить из Java-фона, является то, что наследование классов - это инструмент, который редко требуется для решения проблем в Python.Модным словом для этой идеи является утка, печатающая .

Большая часть программы на Python обращается к атрибутам объекта или вызывает их.Как и в Java, вы можете получить полезное поведение, предоставив функции, которая ожидает объект одного типа, объект другого, более усовершенствованного типа.Чтобы это работало в java, необходимо, чтобы замещенный объект либо наследовал от ожидаемого типа, либо реализовывал ожидаемый интерфейс.

В python это вообще не нужно;Если замещенный объект имеет все атрибуты, ожидаемые от функции, которую вы передаете ему, то он просто будет работать.

Единственная причина для достижения наследования в python заключается в том, что суперкласс действительно, действительно, делает практически всеиз всего, что вам нужно для создания нового типа, и вам нужно только добавить несколько дополнительных поведений.

Наиболее распространенный пример этого - протокол итератора в python.Любой объект, имеющий метод __iter__(), который возвращает сам объект, и метод next(), который вообще возвращает что-либо, является итератором и может отображать оператор for.str, list, dict, file и многие другие типы, которые не имеют ничего общего, и только глобальный object в качестве общего суперкласса, каждый реализует протокол итератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...