Различия между «Java OOP» и «Pythonic OOP»? [закрыто]


19

Я начал с ActionScript 2.0, а затем продолжил с Java. С тех пор я изучил или, по крайней мере, использовал несколько языков, включая Python (вероятно, мой любимый).

Я боюсь, что мой стиль объектно-ориентированного программирования очень непитонен, и больше похож на Java OOP с синтаксисом Python. Что отличает Java like и Pythonic OOP друг от друга? Какие вещи Java-программисты часто делают «непитонно» при написании объектно-ориентированного кода на Python?

Ответы:


54

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

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

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

Путь Java: чистая система - это система, которая выполняет то, для чего предназначена, и ничего больше, она не допускает расширений или модификаций, которые противоречат природе предполагаемой цели, и будет пытаться применять их в максимально возможной степени через компилятор. Гибкость достигается за счет тщательного создания простых интерфейсов внутри строгих структур. В Java песочница всегда должна быть четко ограничена, и превышение этих параметров встречается с быстрой обратной связью компилятора. Java предоставляет средства для статического определения структур объектов и создания динамических взаимодействий из их экземпляров. Когда я работаю на Java, я стараюсь умело создавать базовые строительные блоки для решения «мертвого мозга». Я в основном работаю снизу вверх, когда у меня есть рабочая теория о том, как решить проблему.

Java будет стремиться производить большое программное обеспечение, которое может охватывать большие команды и предоставлять инструменты и средства для контроля за стадом. Если его не остановить, это приведет к тому, что очень отдельные команды будут работать независимо друг от друга для достижения еще более неясной цели. В конце концов, каждая команда становится своим собственным «смыслом существования», и система в целом растворяется, сбивая с толку основной проект. Это может привести к чрезмерному перерасходу средств и огромным программным системам, которые плохо работают и обслуживаются.

В Java почти никогда не бывает простого и быстрого способа сделать что-либо, но IDE и инструментарий созданы для выполнения болезненных задач всего за несколько кликов.

Путь Python: Чистый означает краткий и легко читаемый. Хорошая система Python разработана таким образом, чтобы вы могли понять ее суть и раскрыть ее внутренние секреты таким образом, чтобы вы могли понять из кода предполагаемое использование и цель этого. Это также позволит вам разработать собственное решение, расширяя и / или инкапсулируя оригинальный дизайн так, чтобы он шел точно в вашем направлении. Python предоставляет средства для создания шаблонов объектов, из которых вы можете динамически изменять экземпляр в соответствии с имеющимися потребностями. В Python я стремлюсь решить проблему сразу, а затем распространять код в логической структуре так, чтобы окончательное решение оставалось настолько простым и читабельным, насколько это возможно. В Python я склонен работать сверху вниз и управлять сложностью увеличения с помощью подхода «разделяй и властвуй».

Команды Python будут стремиться создавать легкие системы и очень быстро предоставлять работающее решение. Они, как правило, будут сплоченной связкой, работающей взаимозаменяемо в любой части системы, проверяя решения друг друга при каждой возможности, которую они получают. Они питаются друг другом, создавая синергию, которая очень волнует. Однако это создает команды, которые трудно масштабировать до более крупных систем и часто попадают в своего рода стеклянный потолок. Введение новых членов в команду поможет, но потребуется некоторое время, чтобы знания распространились настолько, чтобы можно было почувствовать дополнительную производительность. Затем команда разделяется, и постоянный обзор всей системы разбавляется, как и атмосфера первых дней. Это может привести к чрезмерно запутанному коду, который когда-то был простой проблемой,

Почти всегда есть быстрый и простой способ сделать что-то с Python, но сложность может быть сложнее контролировать, когда система достигает определенного порога.

Короче говоря, у обоих есть темная сторона, и у обоих есть ясная сила. Однако, подталкивая к обоим сообществам, вы обнаружите, что сила одного ведет к темной стороне другого и наоборот.

Отсюда горячие споры о том, какой из них лучше.


14

Таким образом, вы знаете все об установке видимости методов и переменных? Да, таких больше нет, все публично. Существуют соглашения об именах и искажение имен, но все еще действительно доступно.

Отчасти гибкость Python обусловлена ​​тем фактом, что вам разрешено делать практически все. Поэтому философия заключается в том, что люди должны знать, как использовать API, а не API, обеспечивающий правильное использование метода.

Вместо перегрузок методов у вас есть переменные по умолчанию. Не используйте изменяемые объекты в качестве значения по умолчанию.

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

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

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

Это те вещи, к которым я должен был привыкнуть, когда сделал этот переход.


1
+1 хорошее краткое изложение некоторых вещей, хотя я знал, что раньше
Anto

6

Ну, у Python нет интерфейсов, есть метаклассы, и он позволяет вводить утки. У Python есть списочные представления, которые очень мощные и не существуют в Java. У Java есть система с богатым типом данных с большим количеством структур данных, а у Python просто есть списки. Поэтому, если вы используете то, что есть в Python, вместо того, чтобы пытаться воссоздать то, что есть в Java в Python, вы, вероятно, пишете код Pythonic.

Но что касается ОО-кода, существуют определенные основы стиля, которые не должны меняться от языка к языку: вы всегда должны стремиться писать код Shy и DRY, пишете ли вы в Applescript, Python, Java или C ++.

----Редактировать----

Как педантично указывает @delnan, на самом деле есть пять составных типов данных, определенных Python на уровне ядра (list, dict, tuple, set и frozenset, согласно моей копии «Python in a Nutshell»). Хотя это действительно так, на самом деле это не имеет отношения к вопросу, который я пытаюсь сформулировать: Python использует списки как важную структуру данных. Да, вы МОЖЕТЕ использовать список в качестве стека, но вы можете использовать точно такой же список в качестве очереди. А потом снова стек

Java, с другой стороны, имеет одну структуру данных ядра (Array, в соответствии с «Руководством по Java Pocket»), но в общем случае вы не сможете добиться многого в Java без импорта коллекций. Как только вы это сделаете, у вас будет доступ в «богатую» (в этом смысле я имею в виду чрезвычайно сложную) библиотеку типов, с помощью которой можно получить те же функциональные возможности, что и в списке Python.

Конечно, у обоих языков есть классы, а у Java - интерфейсы, но, хотя они являются составными типами данных, на самом деле они не являются структурами данных в смысле учебника.

Единственное отличие состоит в том, что вы не можете извлечь элемент из Java-очереди, и вы не можете передать объект Java-очереди в другое место, которое ожидает Java Linked List. Так что, возможно, под «богатыми» я имею в виду «жесткие».

Итак, чтобы объяснить, что я имею в виду, говоря «у Python просто есть списки», я имею в виду, что вы можете делать практически все, что вам нужно делать в Python, что вы делаете с коллекциями Java, используя тип списка Pythons. Этот единственный тип выполняет работу множества типов в Java.

Что это значит для программиста на Python? Это означает, что вы можете использовать тип списка Python для написания очень содержательного, прямого кода без использования дополнительных библиотек - и содержательность (то есть характеристика передачи большего значения в меньшем количестве символов) является основной характеристикой кода «Pythonic» ,


Я знаком со всеми, кроме метаклассов, буду искать их. Спасибо :)
Anto

7
-1, пока вы не сможете объяснить следующее: (1) «У Python просто есть списки» - у Python множество структур данных. Он не имеет трех реализаций каждой отдельной структуры данных, когда-либо задуманной, но все же о каждой, которая понадобится большинству людей. (2) Называть систему типов Java «богатой» - это издевательство над этими действительно сложными системами типов. Для начала посмотрите на Haskell (98 без каких-либо расширений).

Извините, это просто неправда. Python имеет ровно две структуры данных: списки и словари. Некоторые БИБЛИОТЕКИ Python могут расширять эти основные структуры, но это не то же самое, что сказать, что в языке они есть.
Philododad

5
Это уже вдвое больше, чем имена ответов. Список удваивается как стек. Наборы и кортежи также являются встроенными (сколько структур данных встроено в Java?) В стандартной библиотеке также есть модули для (min-) куч, deques, неизменяемых записей и плотно упакованных однородных массивов (ограничено C типов). И это только из головы. Да, большинство из них используют списки / дикты для внутренних целей (однако, наборы не являются диктантами с неиспользованными ключами). Но так же, как и большинство коллекций на Java - фактически на всех языках. Вот как это работает.

1
Теперь я думаю, что понимаю смысл, который вы пытались сделать (и убрал мое отрицательное голосование - которое я добавил в первую очередь, потому что эта часть была явно неправильной, как это было первоначально заявлено). Я все еще думаю, что вам нужно рассмотреть по крайней мере две структуры данных (списки как почти универсальные последовательности и дикты как почти универсальные отображения). И это не говоря уже о различных итераторах и генераторах, которые я использую как минимум (и, вероятно, даже чаще) как списки.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.