Я хочу выучить ООП. Я знаю Python и очень мало знаю об ООП.
Но когда я искал «изучить ООП» на форумах, я увидел парня, который сказал, что «Python настолько нов, что вы не можете изучать ООП на Python. Вы должны изучить Java, а затем понять ООП на Java»
Это правда? Есть ли разница в понимании ООП на разных языках программирования? как узнать это на Java, C #, C ++, Perl или Python?
java
object-oriented
python
user2783998
источник
источник
Ответы:
Объект как теоретическая конструкция очень прост: это структура, которая хранит данные, функции или и то, и другое. Идея состоит в том, что эти структуры имеют чувство «я», которое неявно присутствует в большинстве языков за пределами Python. Это называется «дескриптором» и дает объекту точку самоссылки, которая связывает данные (переменные или поля) и функции (обычно называемые методами) с конкретным объектом, о котором идет речь. Идея заключается в том, что вы специально используете переменную или метод, который принадлежит этому конкретному экземпляру (выделенному блоку памяти, как правило, ниже), а не какой-то более крупной, более общей конструкции.
Объектные системы имеют тенденцию варьироваться в отношении двух больших категорий: наследование и доступ.
В некоторых, например в Java или C ++, вы объявляете классы, которые действуют как «чертежи» для объектов, которые затем выделяются. Эти классы и их объекты не могут быть структурно изменены после создания экземпляра. Их содержимое может быть переопределено в том смысле, что переменные могут изменяться, но их структура является статической. Например, вы не можете добавлять новые методы в HashMap в Java. Вы можете расширить интерфейс (в основном частично реализованные классы, служащие контрактами) или создать подкласс, чтобы получить дополнительные методы или переменные, которые вам нужны, вместе со всеми исходными переменными и методами конкретного рассматриваемого класса.
Другие языки на основе классов, наиболее часто упоминаемый как Ruby, позволяют легко открывать существующий класс и просто добавлять методы по своему усмотрению. Это яблоко раздора, и многие считают его очень и очень опасным.
Javascript еще слабее, объекты - это не что иное, как набор слотов для переменных или функций. Они могут быть изменены или перезаписаны всякий раз, когда программист чувствует необходимость в этом. Их можно даже произвольно клонировать как «прототипы» для других объектов, тем самым передавая все свои способности.
Контроль доступа является еще одной большой разницей между различными языками.
Некоторые языки, такие как Java, имеют очень строго обязательные модификаторы доступа, такие как «private» и «protected», которые точно определяют, какие классы и подклассы могут использовать данную переменную или метод.
Другие, такие как Python, менее формальны и используют соглашение о подчеркивании перед именем метода или переменной, чтобы указать, что оно является закрытым.
В конечном счете, Python является совершенно законным языком для программирования объектно-ориентированным способом, но он не обеспечивает его столь же строго, как некоторые другие.
источник
private
для Java, и подчеркивание (__
) для Python, является довольно важным. Я думаю, что уровень абстракции Python может сделать его немного более сложным для начинающего, но определенно не невозможным. Java излагает это для программиста, что может сделать некоторые концепции более легкими.Изучение принципов ООП вообще не зависит от языка, поэтому, если под «изучать ООП» вы подразумеваете «узнать, что означает терминология, что такое ООП и почему я мог бы использовать ее», то язык не имеет значения.
Если вы имеете в виду «научиться разрабатывать с использованием ООП», то да, разные языки обрабатывают это по-разному, но все они используют один и тот же набор принципов. Если вы чем-то похожи на меня, вы узнаете это лучше всего, просто делая это. Выберите объектно-ориентированный язык с хорошим учебником или книгой, который охватывает объектно-ориентированные аспекты и имеет к нему. Если у вас есть принципы объектно-ориентированного проектирования, вы сможете использовать их на любом другом языке ОО.
Это только делает мою голову болит. Столько неверно втиснуто в одно предложение.
Python датируется 1989 годом.
http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html
Ява до 1995.
http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html
Вы можете сделать свои собственные выводы о обоснованности этого совета ...
источник
Я думаю, что человек, которого вы цитируете, просто демонстрировал языковой шовинизм.
В действительности существует разница между концепциями ООП и реализацией ООП. Поэтично, это лучше понять, когда вы лучше разберетесь в некоторых понятиях ООП.
Многим программистам становится комфортно с несколькими подобными языками, поэтому им не нужно расширять свои возможности или страдать, если они не способны какое-то время.
Таким образом, вопрос сводится к тому, действительно ли Python научит вас концепциям ООП?
Я скажу, что вы можете, при условии, что у вас есть адекватная поддержка обучения, которая заставляет вас пробовать вещи, которые вы обычно не изучаете в процессе самостоятельного обучения. Лучше всего подойдет книга или какой-нибудь наставник. Марк Лутц пишет очень глубокие, очень подробные и очень отличные книги по Python, и я бы порекомендовал его книги, потому что они подтолкнут вас к тому, чтобы делать больше и узнавать больше.
То, что вы должны помнить, это то, что путь Python - это не Единственный и не Единственный правильный путь. Чем больше парадигм программирования вы освоите, тем лучше станете программистом. Python делает ООП не совсем так, как это делает C ++ или Java, но концепции хорошо переносятся.
источник
Да, реализации ООП очень разные. Теория и принципы одинаковы, но так много людей считают, что Java и C ++ делают только "настоящий ООП", что вы получаете много ссылок, которые должны быть "независимыми от языка", но фактически предполагают основанные на классах языки со статической типизацией ,
Это не значит, что эти ссылки плохие или даже ограниченные; например, основополагающая книга «банды четырех» (GoF) «Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения» является ярким примером великой работы, которая говорит «ООП», когда она действительно означает «ООП на основе статического класса».
Итак, на мой взгляд: да, вы можете выучить много ООП на Python, Javascript, C и многих других языках; но некоторые люди (возможно, будущий работодатель), когда спрашивают о «опыте ООП», имеют в виду Java / C ++ / C #. Так что было бы разумно проверить и эту другую точку зрения.
(и это не единственные два «типа» ООП ....)
источник
Объектно-ориентированное программирование - это идея о том, как структурировать язык программирования для обеспечения слабой связи, сокрытия информации (иначе говоря, инкапсуляции), объединения данных и методов, которые оперируют этими данными, и повторного использования кода. Многие языки реализуют свои взгляды на эти идеи, поэтому существуют различия между языками относительно того, как они подходят к объектно-ориентированной. Например, Java только позволяет классу расширять 1 класс. Тем не менее, Python и C ++ позволяют расширять любое количество классов. У Java есть определенные причины для его ограничений. Ограничения, которые предназначены для исправления ошибок в C ++, а также потому, что Smalltalk поддерживает только один базовый класс.
ОО языки могут быть сгруппированы в две семьи. Семейство языков Smalltalk (или ООП на основе классов) включает в себя C ++, Java, Smalltalk, Ruby, C #, Python и многие другие (в этом семействе есть тонны). Это смесь языков статического и динамического типов, и хотя они немного отличаются по некоторым понятиям, они очень похожи в том, как они думают об ООП. Под этим я подразумеваю, как они подходят к связыванию, инкапсуляции, привязке данных и методов, повторному использованию кода и инструментам, которые они предоставляют для этого. Внутри этой семьи многие понятия одинаковы.
Другое семейство - ООП на основе прототипа. Эти языки выглядят очень по-разному в своей реализации ООП. Вероятно, наиболее известным примером этого является Javascript, но Javascript скопировал эти идеи из LISP Scheme и Object. Это менее известные языки и обычно динамически типизированные. Я не могу думать о статически типизированном языке, основанном на прототипах, но это не значит, что его нет. Вы можете прочитать об этом здесь: http://en.wikipedia.org/wiki/Prototype-based_programming . Дело в том, что они подходят к ООП совсем не так, как языки на основе классов. Это означает, что понятия не так переносимы между этими двумя семействами. То, что вы знаете ОО в одной семье, не означает, что вы легко перенесете эти идеи в другую семью.
Имейте в виду, что большинство языков программирования сочетают понятия с множеством идей. Python и Ruby включают идеи ООП и функционального программирования в свои языки. И вы можете смешивать ОО на основе прототипов с определенными расширениями для языков на основе классов, так что это еще более сложно.
источник
ООП - это принцип программирования - это принципиально идея. Реализация ООП варьируется в разных языках программирования - но столбы (абстракция, наследование, инкапсуляция и полиморфизм) ООП обычно присутствуют в той или иной форме.
Я скажу без предпочтения любого языка, что Java продвигает семантику немного сложнее для программиста, чем, скажем, Python.
Например,
Java-код:
class Cat extends Animal {}
Немного более очевидно, что вы делаете с точки зрения ООП, чем:
Код Python:
class Cat(Animal):
Конечно, они оба определяют иерархию классов, в которой Cat наследуется от Animal. Но я чувствую, что для программиста, только начинающего работать с ООП, применение и смысл идей ООП могли бы быть немного лучше в Java, так как он предназначен для программиста.
источник
Вы явно спрашиваете, какой самый простой язык для изучения концепций ООП. Я думаю, что ответ ясен: питон .
Чтобы показать, почему это так, давайте посмотрим на типичную программу для начинающих в Java против Python. Давайте сделаем простую игру в догадки.
Ява
На Java вы напишете класс Game.
Я опытный программист, и даже у меня возникают трудности. Кроме того, посмотрите, что вы должны объяснить будущему ученику для этой простой программы:
this.
нотация для ссылки на переменные, когда они маскируются другимиSystem.out
является выходным потоком. И да, это поле, но этоstatic
поле.String[]
это массив. Это особый тип объекта, но опять же, не совсем.int
это примитивный тип. Это особенное.питон
Python намного «чище». Там нет примитивных типов. Конструктор не существует, есть только специальный метод, который вызывается при инициализации.
Вам не нужно взаимодействовать с консолью, так как у вас есть
REPL
. Вы можете просто играть в игру, используяg.guess(35)
и возвращая строку.Это облегчает изучение языка и понимание основных концепций ООП.
источник
Основная идея в ООП заключается в инкапсуляции (что означает объединение или скрытие) переменных и методов вместе внутри классов (что Python абсолютно поддерживает). Речь идет о разработке вашего кода вокруг существительных. Тогда это отчасти продолжается.
Хотя есть различия в реализации (например, python не поддерживает видимость, как в Java) и синтаксические различия (в Javascript вы должны наследовать методы самостоятельно), базовый дизайн остается прежним.
Я действительно думаю, что изучать ООП легче на языке, подобном Java, тем не менее, потому что язык требует этого, и сообщество менее противно, чем, скажем, сообщество Python.
Но есть множество писем о дизайне и практиках ООП, и чтение это не напрасная работа. Даже когда я пишу на python (что очень много), я пишу много объектов и использую много объектов из сторонних библиотек.
источник
Когда вы изучаете ООП на языке, вы начинаете думать на этом языке. Язык влияет на то, что, как вы думаете, можно сделать и как, а также добавляет изюминку в ООП.
Некоторые люди не могут делать ООП без занятий. Некоторые должны убить свои объекты в процессе.
Существует ядро ООП и оригинальные идеи о нем. Вы также можете взглянуть на Smalltalk, Self, Simula, LISP, Newspeak. А также взглянем на не-ООП языковые типы, такие как языки потока данных bash, APL, J. Logical, Prolog. Хаскель (тип занятий). Все они научат вас другому мышлению, и вы можете узнать, что
И в конце вы можете увидеть, для чего ООП хорош. По крайней мере, у вас будет другое представление об этом. Я предлагаю найти беседы Алана Кея .
Если вы не смотрите на языки, этот пост бесполезен.
Как вы можете видеть здесь: мы не можем договориться о том, что такое ООП.
источник