Все ли объект в python, как ruby?

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

Это правда? Все ли объект в python, как ruby?

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

y = 5.plus 6

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

Ответ 1

DiveIntoPython - все это объект

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

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

Ruby Docs - для Ruby From Python

Как и в Python, в Ruby,... Все это объект

Итак, у вас есть это на собственном веб-сайте Ruby: в Python все это объект.

Ответ 2

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

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

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

(5).__str__()

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

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

(5).__add__(6)

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

foo(5)

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

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

В то время как рубин эффективно делает это:

Object.foo(5)

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

Ответ 3

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

>>> (1).__add__(2)
3

Ответ 4

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

Ответ 5

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

Ответ 6

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