Языки программирования питон ява
Объектно-ориентированное программирование в Java и Python: сходства и отличия
Привет, Хабр! Представляю вашему вниманию перевод статьи “Object-Oriented Programming in Python vs Java” автора Джона Финчера.
Реализация объектно-ориентированного программирования (ООП) в языках Java и Python отличается. Принцип работы с объектами, типами переменных и прочими языковыми возможностями может вызвать затруднение при переходе с одного языка на другой. В данной статье, которая может быть полезной как для Java-программистов, желающих освоить Python, так и для Python-программистов, имеющих цель лучше узнать Java, приводятся основные сходства и отличия этих языков, применительно к ООП.
Подробнее – под катом.
Примеры классов в Python и Java
Для начала давайте реализуем простейший класс в Python и Java, чтобы проиллюстрировать некоторые отличия в этих языках, и будем постепенно вносить в этот класс изменения.
Представим, что у нас есть следующее определение класса Car в Java:
Имя исходного Java-файла должно соответствовать имени хранящегося в нем класса, поэтому мы обязаны назвать файл Car.java. Каждый Java-файл может содержать только один публичный класс.
Такой же класс в Python будет выглядеть так:
В Python вы можете объявить класс где угодно и когда угодно. Сохраним этот файл как car.py.
Используя эти классы как основу, продолжим исследование основных компонентов классов и объектов.
Атрибуты объекта
Во всех объектно-ориентированных языках данные об объекте где-то хранятся. И в Python, и в Java эти данные хранятся в атрибутах, которые являются переменными, связанными с конкретными объектами.
Одним из наиболее значительных отличий между Python и Java является то, как они определяют атрибуты класса и объекта и как эти языки управляют ими. Некоторые из этих различий вызваны ограничениями, налагаемыми языками, в то время как другие связаны с более эффективной практикой.
Объявление и инициализация
В Java мы объявляем атрибуты (с указанием их типа) внутри класса, но за пределами всех методов. Перед тем, как использовать атрибуты класса, мы должны их определить:
В Python же мы объявляем и определяем атрибуты внутри метода класса init(), который является аналогом конструктора в Java:
Указывая перед именем переменных ключевое слово self, мы говорим Python-у, что это атрибуты. Каждый экземпляр класса получает свою копию. Все переменные в Python не типизированы (loosely typed), и атрибуты не являются исключением.
Переменные можно создать и за пределами метода init(), но это не будет лучшим решением и может привести к труднообнаруживаемым багам. Например, можно добавить объекту Car новый атрибут wheels следующим образом:
Однако, если мы забудем указать в 6-й строке выражение my_car.wheels = 5, то получим ошибку:
В Python если объявить переменную за пределами метода, то она будет рассматриваться как переменная класса. Давайте изменим класс Car:
Теперь изменится использование переменной wheels. Вместо обращения к ней через объект, мы обращаемся к ней, используя имя класса:
Примечание: в Python обращение к переменной класса происходит по следующему синтаксису:
Поскольку мы сохранили класс Car в файле car.py, мы обращаемся к переменной класса wheels в 6-й строчке таким образом: car.Car.wheels.
Работая с переменной wheels, необходимо быть обратить внимание на то, что изменение значения переменной экземпляра класса my_car.wheels не ведет к изменению переменной класса car.Car.wheels:
На 2-й и 3-й строчках мы определили два объекта Car: my_car и my_other_car.
Сначала свойство wheels у обоих объектов равно нулю. На 16-й строке мы установили переменную класса: car.Car.wheels = 4, у обоих объектов теперь по 4 колеса. Однако, затем когда на 24-й строке мы меняем свойство объекта my_car.wheels = 5, свойство второго объекта остается нетронутым.
Это означает, что теперь у нас две различные копии атрибута wheels:
В Java эквивалентом атрибута класса является статичный (static) атрибут:
Обычно мы обращаемся к статичным переменным в Java через имя класса. Можно обратиться к ним и через экземпляр класса, как в Python, но это не будет лучшим решением.
Наш Java-класс начинает удлиняться. Одной из причин, почему Java «многословнее» Python-а, является понятие публичных (public) и приватных (private) методов и атрибутов.
Публичные и приватные
Java управляет доступом к методам и атрибутам, различая публичные и приватные данные.
В Java ожидается, что атрибуты будут объявлены как приватные (или защищенные — protected, если нужно обеспечить к ним доступ потомкам класса). Таким образом мы ограничиваем доступ к ним извне. Чтобы предоставить доступ к приватным атрибутам, мы объявляем публичные методы, которые устанавливают или получают эти данные (подробнее об этом – чуть позже).
Вспомним, что в нашем Java-коде переменная color была объявлена приватной. Следовательно, нижеприведенный код не скомпилируется:
Если не указать уровень доступа к атрибутам, то по умолчанию он будет установлен как package protected, что ограничивает доступ к классам в пределах пакета. Если же мы хотим, что вышеуказанный код заработал, то придется сделать атрибут публичным.
Однако, в Java не приветствуется объявление атрибутов публичными. Рекомендуется объявлять их приватными, а затем использовать публичные методы, наподобие getColor() и getModel(), как и было указано в тексте кода выше.
В противоположность, в Python отсутствуют понятия публичных и приватных данных. В Python всё – публичное. Этот питоновский код сработает на ура:
Вместо приватных переменных в Python имеется понятие непубличных (non-public) переменных экземпляра класса. Все переменные, названия которых начинаются с одинарного подчеркивания, считаются непубличными. Это соглашение об именах нисколько не мешает нам обратиться к переменной напрямую.
Добавим следующую строку в наш питоновский класс Car:
Мы можем получить доступ к переменной _cupholders напрямую:
Python позволяет получить доступ к такой переменной, правда, некоторые среды разработки вроде VS Code выдадут предупреждение:
Кроме этого, в Python для того, чтобы скрыть атрибут, используется двойное подчеркивание в начале названия переменной. Когда Python видит такую переменную, он автоматически меняет ее название, чтобы затруднить к ней прямой доступ. Однако, этот механизм всё равно не мешает нам обратиться к ней. Продемонстрируем это следующим примером:
Теперь если мы обратимся к переменной __cupholders, мы получим ошибку:
Так почему же атрибут __cupholders не существует?
Дело вот в чем. Когда Python видит атрибут с двойным подчеркиванием в самом начале, он меняет его, добавляя в начало имя класса с подчеркиванием. Для того чтобы обратиться к атрибуту напрямую, необходимо также изменить имя:
Теперь возникает вопрос: если атрибут Java-класса объявлен приватным и атрибуту Python-класса предшествует в имени двойное подчеркивание, то как достучаться до этих данных?
Управление доступом
В Java мы получаем доступ к приватным атрибутам при помощи сеттеров (setters) и геттеров (getters). Для того чтобы пользователь перекрасил-таки свою машину, добавим следующий кусок кода в Java-класс:
Поскольку методы getColor() и setColor() – публичные, то любой пользователь может вызвать их и получить / изменить цвет машины. Использование приватных атрибутов, к которым мы получаем доступ публичными геттерами и сеттерами, — одна из причин большей «многословности» Java в сравнении с Python.
Как было показано выше, в Python мы можем получить доступ к атрибутам напрямую. Поскольку всё – публичное, мы может достучаться к чему угодно, когда угодно и откуда угодно. Мы можем получать и устанавливать значения атрибутов напрямую, обращаясь по их имени. В Python мы можем даже удалять атрибуты, что немыслимо в Java:
Однако бывает и так, что мы хотим контролировать доступ к атрибутам. В таком случае нам на помощь приходят Python-свойства (properties).
В Python свойства обеспечивают управляемый доступ к атрибутам класса при помощи декораторов (decorators). Используя свойства, мы объявляем функции в питоновских классах подобно геттерам и сеттерам в Java (бонусом идет удаление атрибутов).
Работу свойств можно увидеть на следующем примере класса Car:
В данном примере мы расширяем понятие класса Car, включая электромобили. В строке 6 объявляется атрибут _voltage, чтобы хранить в нем напряжение батареи.
В строках 9 и 10 для контролируемого доступа мы создаем функцию voltage() и возвращаем значение приватной переменной. Используя декоратор @property, мы превращаем его в геттер, к которому теперь любой пользователь получает доступ.
В строках 13-15 мы определяем функцию, так же носящую название voltage(). Однако, мы ее декорируем по-другому: voltage.setter. Наконец, в строках 18-20 мы декорируем функцию voltage() при помощи voltage.deleter и можем при необходимости удалить атрибут _voltage.
Декорируемые функции носят одинаковые имена, указывая на то, что они управляют доступом к одному и тому же атрибуту. Эти имена функций также становятся именами атрибутов, используемых для получения их значений. Вот как это работает:
Обратите внимание, что мы используем voltage, а не _ voltage. Так мы указываем Python-у на то, что следует применять свойства, которые только что определили:
Вышеприведенные декораторы дают нам возможность контролировать доступ к атрибутам без использования различных методов. Можно даже сделать атрибут свойством только для чтения (read-only), убрав декорированные функции @.setter и @.deleter.
self и this
В Java класс ссылается сам на себя, используя ключевое слово this:
this подразумевается в Java-коде. Его в принципе даже необязательно писать, кроме случаев, когда имена переменных совпадают.
Сеттер можно написать и так:
Поскольку в классе Car есть атрибут под названием color и в области видимости нет больше переменных с таким именем, ссылка на это имя срабатывает. Мы использовали ключевое слово this в первом примере для того, чтобы различать атрибут и параметр с одинаковым именем color.
В Python ключевое слово self служит аналогичной цели: обращение к членам-атрибутам, но в отличие от Java, оно обязательно:
Python требует написания self в обязательном порядке. Каждый self либо создает, либо обращается к атрибуту. Если мы пропустим его, то Python просто создаст локальную переменную вместо атрибута.
Отличие в том, как мы используем self и this в Python и Java, происходит из-за основных различий между двумя языками и от того, как они именуют переменные и атрибуты.
Методы и функции
Разница между рассматриваемыми языками заключается в том, что в Python есть функции, а в Java их нет.
В Python следующий код отработает без проблем (и используется повсеместно):
Мы можем вызвать say_hi() из любого места видимости. Эта функция не содержит ссылки на self, что означает, что это глобальная функция, а не функция класса. Она не сможет изменять или сохранять какие-нибудь данные какого-либо класса, но может использовать локальные и глобальные переменные.
В противоположность, каждая написанная нами строчка на Java принадлежит какому-нибудь классу. Функции не существует за пределами класса, и по определению все Java-функции — это методы. На Java ближе всего к чистой функции находится статичный метод:
Utils. SayHi() вызывается из любого места без предварительного создания экземпляра класса Utils. Поскольку мы вызываем SayHi() без создания объекта, ссылки this не существует. Однако, это всё равно не функция в том смысле, в котором является say_hi() в Python.
Наследование и полиморфизм
Наследование и полиморфизм – две фундаментальные концепции в ООП. Благодаря первому, объекты получают (другими словами, наследуют) атрибуты и функциональные возможности других объектов, создавая иерархию от более общих объектов к более конкретным. Например, и класс Car (машина), и класс Boat (лодка) являются конкретными типами класса Vehicle (транспортное средство). Оба объекта наследуют поведение одного родительского объекта или множества родительских объектов. В этом случае их называют дочерними объектами.
Полиморфизм, в свою очередь, — это возможность работы с разными объектами с помощью одной и той же функции или метода.
Обе эти фундаментальные ООП-концепции реализованы в Java и Python совершенно по-разному.
Наследование
Python поддерживает множественное наследование, то есть создание класса более чем от одного родителя.
Чтобы продемонстрировать это, разделим класс Car на две категории: одну – для транспортных средств и одну – для машин, использующих электричество:
В классе Vehicle определены атрибуты color и model. В классе Device имеется атрибут _voltage. Класс Car происходит от этих двух классов, и атрибуты color, model и _voltage теперь являются частью нового класса.
В методе init() класса Car вызываются методы init() обоих родительских классов, чтобы все данные проинициализировались должным образом. После этого мы можем добавить классу Car любую желаемую функциональность. В данном примере мы добавим атрибут year, а также геттер и сеттер для _voltage.
Функциональность нового класса Car осталась прежней. Мы можем создавать и использовать объекты класса, как это делали несколькими примерами ранее:
Язык Java же, в свою очередь, поддерживает только одиночное наследование, что означает, что классы в Java могут наследовать данные и поведение только от одного родительского класса. Зато в Java возможно наследование от множества интерфейсов. Интерфейсы обеспечивают группу связанных методов, которые нужно реализовать, позволяя дочерним классам вести себя сходным образом.
Чтобы увидеть это, разделим Java-класс Car на родительский класс и интерфейс:
Не забываем, что каждый класс и каждый интерфейс в Java должны быть размещены в своем собственном файле.
Как и в вышеприведенном примере с Python, мы создаем новый класс Vehicle для хранения общих данных и функционала, присущих транспортным средствам. Однако для добавления функциональных возможностей Device нам нужно создать интерфейс, определяющий метод получения напряжения (voltage) устройства.
Класс Car создается путем наследования от класса Vehicle с использованием ключевого слова extends и реализации интерфейса Device с использованием ключевого слова implements. В конструкторе класса мы вызываем конструктор родителя при помощи super(). Поскольку родительский класс только один, мы обращаемся к конструктору класса Vehicle. Для реализации интерфейса переопределяем getVoltage() с помощью аннотации Override.
Вместо повторного использования кода из Device, как это делается в Python, Java требует, чтобы мы реализовывали один и тот же функционал в каждом классе, который реализует интерфейс. Интерфейсы всего лишь определяют методы — они не могут определять данные экземпляра класса или детали реализации.
Так почему же это происходит с Java? Причина кроется в типах данных и проверке типов.
Типы данных и полиморфизм
Каждый класс и каждый интерфейс в Java имеет тип. Следовательно, если два Java-объекта реализуют один и тот же интерфейс, считается, что они имеют один и тот же тип по отношению к этому интерфейсу. С помощью этого механизма можно взаимозаменяемо использовать различные классы, в чем и заключается полиморфизм.
Реализуем зарядку устройства для наших Java-объектов при помощи создания метода charge(), который принимает в качестве параметра переменную типа Device. Любой объект, реализующий интерфейс Device, может быть передан методу charge().
Создадим следующий класс в файле под названием Rhino.java:
Теперь создадим файл Main.java с методом charge() и посмотрим, чем отличаются объекты классов Car и Rhino.
Поскольку в классе Rhino не реализован интерфейс Device, его нельзя передать в качестве параметра в charge().
В отличие от статической типизации (в оригинале — strict variable typing, то есть строгая типизация, но Python тоже относится к языкам со строгой типизацией) переменных, принятой в Java, в Python используется концепция утиной типизации, которая в общем виде звучит так: если переменная «ходит как утка и крякает как утка, то это и есть утка» (на самом деле звучит немного иначе: «если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка» – прим. переводчика). Вместо идентификации объектов по типу, Python проверяет их поведение.
Лучше понять утиную типизацию поможет следующий аналогичный пример зарядки устройства на Python:
charge() проверяет существование в объекте атрибута _voltage. Поскольку в классе Device имеется такой атрибут, то и в любом его классе-наследнике (Car и Phone) тоже будет этот атрибут, и, следовательно, этот класс выведет сообщение о зарядке. У классов, которые не унаследовались от Device (как Rhino), не будет этого атрибута, и они не будут заряжаться, что хорошо, поскольку для жизни носорога (rhino) электрическая зарядка смертельно опасна.
Дефолтные методы
Все классы в Java имеют своим предком класс Object, который содержит определенный набор методов и передает их своим потомкам. Потомки могут эти методы либо переопределять, либо использовать по умолчанию. Класс Object включает в себя следующие методы:
По умолчанию equals() сравнивает адреса в памяти текущего объекта с объектом, переданным в качестве параметра, hashCode() вычисляет уникальный идентификатор, который так же использует адрес в памяти текущего объекта. Эти методы активно используются в Java в различных контекстах. Например, коллекциям, которые сортируют объекты на основе их значений, нужны оба этих метода.
toString() возвращает строковое представление объекта. По умолчанию это имя класса и адрес в памяти. Этот метод вызывается автоматически, когда объект передается в качестве параметра в метод, требующий строковый аргумент, например, System.out.println():
Запустим этот код и увидим дефолтное строковое представление объекта car:
Не очень информативно, не правда ли? Давайте усовершенствуем вывод, переопределив метод toString(). Добавим следующий метод в класс Car:
Теперь, запустив предыдущий пример, увидим следующее:
В Python подобный функционал обеспечивается набором так называемых магических методов (dunder — аббревиатура для double underscore). Каждый Python-класс наследует эти методы, и мы можем, переопределив их, изменить их поведение.
В Python для строкового представления объекта имеется два метода: repr() и str(). Однозначное представление объекта возвращается методом repr(), в то время как str() возвращает его в удобочитаемом виде. Это примерно как hashcode() и toString() в Java.
Как и в Java, в Python имеется дефолтная реализация магических методов:
Чтобы улучшить читаемость, переопределим метод str() в Python-классе Car:
Результат будет выглядеть намного приятнее:
Переопределение магического метода дало нам более читаемое представление объекта. Можно также переопределить метод repr(), это полезно для отладки.
Python предоставляет нам гораздо большее количество магических методов, переопределяя которые, можно изменить поведение объекта во время итерации, операций сравнения и сложения или непосредственного вызова объекта.
Перегрузка операторов
Перегрузка операторов в Python означает возможность в классах переопределять различные операторы языка. Магические методы Python позволяют реализовать перегрузку операторов, чего Java не предлагает вообще.
Изменим наш Python-класс Car следующим образом:
Данная таблица показывает связи между этими магическими методами и операторами, которые они представляют:
Python против Java: самые важные различия
В этой статье мы представим исчерпывающую статью о Python против Java и их наиболее важных различиях. Java — это объектно-ориентированный язык программирования. Python — это мультипарадигмальный язык программирования. Python и Java являются независимыми от платформы языками. В этом уроке мы увидим возможности Python и Java, чтобы увидеть различия.
Содержание
1. Обзор
В этой статье мы рассмотрим сравнение языков Python и Java. Они могут быть использованы для разработки программного обеспечения и выполнения кода. Python — это язык программирования, который имеет динамические типы. Python начинал в исследовательской фирме, базирующейся в Нидерландах. Целью этого языка было уменьшить разрыв между синтаксисом команд оболочки и C. Мотивация языка исходит от разных языков, таких как Algol68, Pascal и ABC. Java-код преобразуется в байт-код после компиляции. Интерпретатор Java запускает байт-код и вывод создается.
Ниже приводится цитата о популярности Python:
« За последние годы я видел довольно сильный рост Python. Как утверждают другие, я думаю, что это в значительной степени связано с наукой о данных, обучением в школах / университетах и более легкими рамками, такими как Flask (против Django). Я не имею ничего против Python (на самом деле мне нравится писать его), но я думаю, что его популярность не отражает использование для корпоративных случаев использования Я редко вижу большие распределенные корпоративные приложения, написанные на Python, которые остаются на Python. Они могут начинать с Python, но в конечном итоге переключаются на что-то другое из-за производительности. »
Дастин Шульц: ведущий инженер-программист, автор Pluralsight и специалист по технологиям
Ниже приводится цитата о виртуальной машине Java:
« Большинству поклонников языка это нравится, потому что это« новый блестящий », и / или у них есть Java Allergy (обычно основанная на взгляде на платформу, которая устарела более чем на 10 лет), но… я не знаю» в нем не было ничего привлекательного, что нельзя было бы сделать довольно легко в технологии JVM (хотя с потенциально немного большим количеством церемоний) — и JVM имеет гораздо лучшую, более широкую интеграцию с библиотеками. «
Бен Эванс, ведущий инженер и архитектор JVM Technologies в New Relic, Inc
2. Python против Java
2.1 Предпосылки
Python 3.6.8 требуется для Windows или любой операционной системы. Pycharm необходим для программирования на Python. Java 8 требуется для операционной системы Linux, Windows или Mac. Для этого примера можно использовать Eclipse Oxygen.
2.2 Скачать
2.3 Настройка
2.3.1 Настройка Python
Для установки python необходимо выполнить загружаемый пакет или исполняемый файл.
2.3.2 Настройка Java
Ниже приведены команды настройки, необходимые для среды Java.
2.4 IDE
2.4.1 Настройка Pycharm
Для установки Pycharm необходимо выполнить пакет Pycharm или установить его.
2.4.2 Настройка Eclipse Oxygen
Eclipse-java-oxygen-2-macosx-cocoa-x86_64.tar можно загрузить с веб-сайта eclipse. Файл tar открывается двойным щелчком мыши. Файл tar распаковывается с помощью утилиты архивирования. После разархивирования вы найдете значок затмения в папке. Вы можете переместить значок затмения из папки в приложения, перетаскивая значок.
2.5 Запуск IDE
2.5.1 Pycharm
Запустите Pycharm и начните создавать чистый Python-проект с именем HelloWorld. На экране показано создание проекта.
Pycharm Создать проект
Настройки проекта устанавливаются на следующем экране, как показано ниже.
Настройки проекта Pycharm
Появится экран приветствия Pycharm, показывающий прогресс, как показано ниже.
Pycharm Project View
Вы можете создать Hello.py и запустить файл python, выбрав меню «Выполнить».
Pycharm Hello World
Выходное сообщение «Hello World» выводится, когда файл python запущен.
Pycharm Python Execution
2.5.2 Eclipse Java
Eclipse имеет функции, связанные с языковой поддержкой, настройкой и расширением. Вы можете нажать на значок затмения, чтобы запустить затмение. Экран затмения появляется, как показано на снимке экрана ниже:
Экран приветствия Eclipse
Вы можете выбрать рабочее пространство на появившемся экране. Прикрепленное изображение показывает, как его можно выбрать.
Вы можете увидеть рабочее место затмения на экране. Прикрепленный снимок экрана показывает экран проекта Eclipse.
Java Hello World класс печатает приветствия. Снимок экрана ниже добавлен, чтобы показать класс и выполнение при затмении.
2.6 Управление памятью
Язык Python имеет функции подсчета ссылок и сбора мусора, связанные с управлением памятью. Язык Java имеет функции, связанные с управлением памятью, и это безопасный для памяти язык. Сборка мусора — это функция, которая помогает собирать бесплатные и свободные ресурсы. Разработчик в Java не может выходить за пределы выделенной памяти. В Java, когда память используется за пределами выделения, он выдает ошибку.
2.7 Исключительная обработка
В Python есть операторы try-исключением-else-finally для обработки исключений. В Java обработка исключений возможна с использованием блоков try, catch и finally.
2.8 Множественное наследование
Множественное наследование поддерживается в Python. Давайте возьмем пример, чтобы увидеть, как он обрабатывается в Python и Java. Грузовик — это транспортное средство и машина.
Множественное наследование
.Java не поддерживает множественное наследование. Каждый класс может расширяться только на один класс, но может реализовывать более одного интерфейса. Пример кода показан ниже класса Truck реализующего интерфейсы Machine и Vehicle
2.9 Темы
Python имеет встроенные потоки, которые можно использовать. В приведенном ниже примере есть функции, связанные с созданием и запуском нового потока.
Java имеет встроенные классы для создания потоков. Чтобы создать новый поток, класс должен расширить класс Thread а метод run должен быть переопределен.
2.10 Портативность
Язык Python является переносимым. Компилятор python создает байт-код python, который выполняется с использованием виртуальной машины python.
Портативность Python
Язык Java интерпретируется интерпретатором Java на компьютере независимо от операционной системы.
Java Портативность
Переносимость Python не так популярна, как Java.
2.11 Типы
Компилятор Python выполняет проверку типов, пока код интерпретируется. В python тип переменной можно изменить в течение жизненного цикла. Утиная типизация связана с концепцией, в которой определение метода важнее, чем класс или тип объекта.
Типы данных Python
Язык Java имеет примитивные и объектные типы. Java имеет функции, связанные с автобоксом, который автоматически преобразует типы. Класс java.lang.Object является базовым классом для всех классов, а Java следует единой корневой цепочке команд.
Типы Java
2.12 Библиотеки
Библиотеки Python состоят из модулей. Модули Python имеют функции и методы.
Библиотека Python
Пакеты Java помогают в классах упаковки. Область действия пакета — еще одна особенность языка Java. Архивы Java помогают группировать пакет классов для выполнения и установки.
Архив Java
2.13 Ошибки во время выполнения
В python ошибки времени выполнения возникают при возникновении RuntimeError. Когда происходят незаконные операции, в python возникают исключения.
Python Runtime
В Java ошибки времени выполнения представляются компилятором и интерпретатором.
Ошибки времени выполнения Java
2.14 Документация
В Python есть модуль pydoc для генерации документации. Java имеет функцию поддержки комментариев, которые можно использовать для генерации документации.
2.15 Мобильный и Интернет и рабочий стол
Язык Python используется для веб-приложений и приложений командной строки для настольных компьютеров. Язык Java может использоваться для разработки мобильных, веб-приложений и приложений для настольных компьютеров. Java поддерживается Android, но python не поддерживается.
2.16 Парадигма программирования
Python поддерживает парадигмы объектно-ориентированного, функционального, императивного и процедурного программирования. Java является объектно-ориентированным, классовым и параллельным языком программирования. Java в настоящее время поддерживает функции функционального программирования начиная с версии 8.
3. Вывод
В целом, Java имеет большие преимущества по сравнению с Python. Приведенная ниже сравнительная таблица отражает различия между Python и Java.
Сравнительная таблица
Характерная черта | питон | Джава |
Управление памятью | Python имеет две функции, связанные с управлением памятью. Это подсчет ссылок и сборка мусора | Сборка мусора — это функция в Java. В Java нет указателей. Java-программы потребляют больше памяти |
наследование | Множественное наследование поддерживается в Python | Интерфейсы могут использоваться для множественного наследования. Одиночное наследование поддерживается в Java. |
Потоки | Python имеет поддержку потоков. | У Java есть класс Thread и интерфейс Runnable для использования потоков. |
портативность | Байт-код Python зависит от платформы | Байт-код Java зависит от платформы. |
Контроль доступа | В Python есть концепция непубличных переменных и свойств экземпляра. | Инкапсуляция помогает в управлении доступом к переменным и свойствам класса в Java. |
Типы | Динамическая и Duck Typing поддерживается в Python | В Java используется одна корневая цепочка шаблонов команд. |
Библиотеки | Библиотеки Python состоят из модулей. Модуль имеет функции и методы. | Архивы Java используются для создания библиотек Java. |
Ошибка выполнения | Python вызывает исключения при возникновении ошибок во время выполнения. RuntimeError вызывается для программной обработки ошибок. | Ошибки времени выполнения обнаруживаются на этапах компиляции и выполнения в Java |
Производительность | Python медленнее чем Java | Производительность Java быстрее по сравнению с Python |
Приведенная ниже цитата из переполнения стека суммирует популярность и популярность Python против Java в сообществе разработчиков
«Python, самый быстрорастущий основной язык программирования, снова поднялся в ряду языков программирования в нашем опросе, вытеснив Java в этом году и став вторым по популярности языком (после Rust)». — StackOverflow 2019