Python изменился на более объектно-ориентированный? - PullRequest
9 голосов
/ 21 мая 2009

Я помню, что когда-то было сказано, что Python менее объектно-ориентирован, чем Ruby , поскольку в Ruby все является объектом. Изменилось ли это и для Python? Является ли последний Python более объектно-ориентированным, чем предыдущая версия?

Ответы [ 6 ]

40 голосов
/ 21 мая 2009

Цзянь Лин - ответ «Да», Python более объектно-ориентирован, чем когда Матц решил, что хочет создать Ruby, и оба языка теперь содержат «все является объектом». Когда Python был моложе, «типам», таким как строки и числа, не хватало методов, тогда как «объекты» создавались с помощью оператора «class» (или намеренно создавали класс в модуле расширения C) и были немного менее эффективными, но поддерживали методы и наследование. В самом начале 1990-х годов, когда быстрая 386 была довольно хорошей машиной, этот компромисс имел смысл. Но типы и классы были объединены в Python 2.2 (выпущен в 2001 году), и строки получили методы, и в более поздних версиях Python пользователи могут даже создавать подклассы из них.

Итак: Python определенно был менее объектно-ориентированным; но, насколько я знаю, все эти старые барьеры теперь исчезли.

Вот руководство по объединению, которое состоялось:

http://www.python.org/download/releases/2.2/descrintro/

Разъяснение: возможно, я могу выразиться еще проще: в Python все всегда было объектом; но некоторые базовые виды объектов (целые, строки), когда-то воспроизводимые по «другим правилам», препятствуют использованию с ними методов программирования ОО (таких как наследование). Теперь это было исправлено. Метод len (), описанный в другом ответе здесь, является, пожалуй, единственным, что мне хотелось бы, чтобы Гвидо изменился при обновлении до Python 3.0. Но, по крайней мере, он дал мне словарь, так что я не буду жаловаться слишком громко. : -)

12 голосов
/ 21 мая 2009

Я не уверен, что покупаю аргумент, что Ruby более объектно-ориентирован, чем Python. Быть объектно-ориентированным - это больше, чем просто использование объектов и точечного синтаксиса. Обычный аргумент, который я вижу, заключается в том, что в Python для получения длины списка вы делаете что-то вроде этого:

len(some_list)

Я вижу это как аргумент bikeshed . То, что это действительно переводит (почти напрямую), это:

some_list.__len__()

, который идеально ориентирован на объект. Я думаю, что Rubyists может немного запутаться, потому что обычно объектно-ориентированное использование использует синтаксис точки (например, object.method()). Однако, если я неправильно понимаю аргументы Rubyists, не стесняйтесь, дайте мне знать.

Независимо от объектной ориентации, есть одно преимущество использования len таким способом. В некоторых языках меня всегда раздражало то, что нужно помнить, использовать ли some_list.size() или some_list.length() или some_list.len для определенного объекта. Путь Python означает, что нужно запомнить только одну функцию

7 голосов
/ 21 мая 2009

Хотя это не совсем правильный ответ ... Почему вы заботитесь о том, чтобы Python был более или менее оО? Крутая вещь в Python - это то, что это pythonic , а не объектно-ориентированная, не функциональная или какая бы то ни было модная парадигма на данный момент! : -)

Я научился программировать с использованием Java и объектной ориентации, но сейчас я не буду об этом забывать, потому что знаю, что ООП не является решением всех проблем (в действительности, нет единой парадигмы). *

см

2 голосов
/ 21 мая 2009

Это неверное убеждение.

Смотрите мой предыдущий ответ здесь для более подробного объяснения:

Является ли все, что в python объектом, как ruby?

Почему бы тогда не открыть .len () прямо из списка? Я думаю, что вы не можете полностью отделить дизайн ОО от синтаксиса, потому что синтаксис в значительной степени определяет вашу парадигму кода. some_list.len () - это OO, потому что вы думаете о списке как об объекте, который сможет сказать вам, какова его длина. Len (some_list) * +1010 *

.len () доступен прямо из списка. Он доступен как __len __ (). len () является функциональным объектом. Вы можете увидеть все его методы с помощью dir (len). Хотя я не знаю, почему Гвидо решил сделать метод __len __ () длиннее, это не меняет того факта, что все они все еще являются объектами.

2 голосов
/ 21 мая 2009

Держись, и Ruby, и Python являются объектно-ориентированными. Объекты есть объекты. Нет более объектно-ориентированной «функции сравнения», которая приведет вас к лучшей. Синтаксис - это не только то, что делает некоторый язык похожим на объектно-ориентированный, но и модель данных .

Объекты - это абстракция Python для данных. Все данные в программе Python представлены объектами или отношениями между объектами. (В некотором смысле и в соответствии с моделью фон Неймана «компьютер с хранимой программой» код также представлен объектами.) http://docs.python.org/reference/datamodel.html

1 голос
/ 21 мая 2009

У меня такое же "восприятие" возможно, полученное из этого:

Почему Python был создан в первую очередь:

Мне пришло в голову, что язык сценариев с синтаксисом, подобным ABC [...], удовлетворит потребность

Интервью с создателем Ruby:

"Мне нужен язык сценариев, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python

Я знаю, что восприятие не то же самое, что реальность. И Python, и Ruby - отличные языки программирования, и оба они очень классные.

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