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

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

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

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

y = 5.plus 6 

Это можно сделать так же в Python?

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

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

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

Ruby Docs – для Ruby From Python

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

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

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

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

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

 (5).__str__() 

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

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

 (5).__add__(6) 

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

 foo(5) 

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

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

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

 Object.foo(5) 

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

Отвечая на ваш второй вопрос, да:

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

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

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

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