Все ли в Python является объектом, похожим на ruby? - PullRequest
44 голосов
/ 15 мая 2009

В комментарии к другому вопросу о переполнении стека говорится, что Python был похож на Ruby, поскольку он относится к «все является объектом», а все в Python было объектом, как Ruby.

Это правда? Все ли в Python является объектом, похожим на ruby?

Чем они отличаются в этом отношении или они действительно одинаковы? Например, вы можете взять число и сделать что-то вроде рубина:

y = 5.plus 6

Можно ли сделать то же самое в Python?

Ответы [ 6 ]

69 голосов
/ 15 мая 2009

DiveIntoPython - все является объектом

Все в Python является объектом, и почти все имеет атрибуты и методы. Все функции имеют встроенный атрибут __doc__, который возвращает строку документа, определенную в исходном коде функции. Модуль sys - это объект, который имеет (среди прочего) атрибут с именем path. И пр.

Тем не менее, возникает вопрос. Что такое объект? Разные языки программирования определяют «объект» по-разному. В некоторых это означает, что все объекты должны иметь атрибуты и методы; в других это означает, что все объекты являются подклассами. В Python определение более слабое; некоторые объекты не имеют ни атрибутов, ни методов (подробнее об этом в главе 3), и не все объекты являются подклассами (подробнее об этом в главе 5). Но все является объектом в том смысле, что его можно присвоить переменной или передать в качестве аргумента функции (подробнее об этом в главе 4).

Документы Ruby - To Ruby From Python

Как и в Python, в Ruby ... все является объектом

Итак, у вас есть это с собственного сайта Руби: в Python все является объектом.

39 голосов
/ 15 мая 2009

Хотя в Python все является объектом, в Ruby он отличается подходом к разрешению имен и взаимодействию с объектами.

Например, хотя Ruby предоставляет вам метод to_s для базового класса Object, для предоставления этой функциональности Python интегрирует его в сам строковый тип - вы преобразуете тип в строку, создавая строку из Это. Вместо 5.to_s у вас есть str(5).

Не обманывайтесь. За кулисами все еще есть метод - вот почему этот код работает:

(5).__str__()

Таким образом, на практике эти два принципиально похожи, но вы используете их по-разному. Длина для таких последовательностей, как списки и кортежи в Python, является еще одним примером этого принципа в действии - фактическая функция построена на методах со специальными именами, но предоставляется через более простой и легкий в использовании интерфейс (функция len).

Таким образом, Python эквивалентно тому, что вы написали в своем вопросе:

(5).__add__(6)

Другое важное отличие заключается в том, как реализованы глобальные функции. В python глобалы представлены словарем (как и местные). Это означает, что следующее:

foo(5)

Эквивалентно этому в python:

globals()["foo"].__call__(5)

Хотя ruby ​​эффективно делает это:

Object.foo(5)

Это оказывает большое влияние на подход, используемый при написании кода на обоих языках. Библиотеки Ruby имеют тенденцию расти за счет добавления методов к существующим типам, таким как Object, в то время как библиотеки Python имеют тенденцию расти за счет добавления глобальных функций к данному модулю.

20 голосов
/ 15 мая 2009

«все» - это немного завышенная цена, как для Python, так и для Ruby - например, if не является «объектом», это ключевое слово, используемое для запуска условного оператора или (в Python) внутри списка Понимания и генератор выражений. Такой энтузиазм вызывает энтузиазм по поводу того, что функции, классы, методы и тому подобное, которые на самом деле не являются объектами в (скажем) C ++, являются объектами в Ruby или Python. Другие вещи могут быть объектами в Ruby, но не Python или наоборот (блоки кода, регулярные выражения, ...).

20 голосов
/ 15 мая 2009

В ответ на ваш второй вопрос, да:

>>> (1).__add__(2)
3
2 голосов
/ 15 мая 2009

Да, насколько я знаю, все это объект в Python. Конечно, примитивные и встроенные типы (int, long, str, float и т. Д.) Могут быть разделены на подклассы - и фактически сами типы являются объектами. Функции - это объекты, классы - это объекты, даже блоки кода в некотором смысле являются объектами ... Я не могу представить в Python ничего такого, что не может рассматриваться как объект.

0 голосов
/ 15 мая 2009

Чтобы добавить комментарий к отличным ответам других людей: все является объектом, но некоторые - особенно строки и числовые типы - являются неизменяемыми. Это означает, что эти типы ведут себя так же, как в таких языках, как C или Java (где целые числа и т. Д. Не являются объектами) в отношении присваивания, передачи параметров и т. Д., И вам никогда не придется беспокоиться о ловушках, вызванных передачей ссылка. Это довольно хорошее решение: -)

...