Все ли объект в 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 (где целые числа и т.д. Не являются объектами) в отношении присвоения, передачи параметров и т.д., И вам никогда не придется беспокоиться о ловушках, Справка. Это довольно хорошее решение: -)