Действительно ли все - объект в Python как рубин?

Ключевое слово compile устарело. Замените их словом implementation. И обновите версии библиотек. Для этого вы можете установить курсор на любую библиотеку, нажать Alt + Enter и выбрать обновить до .... Например, измените эти библиотеки на следующие версии: ]

implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
45
задан dreftymac 12 April 2019 в 16:55
поделиться

6 ответов

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

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

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

Ruby Docs - To Ruby From Python

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

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

69
ответ дан 26 November 2019 в 20:50
поделиться

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

1
ответ дан 26 November 2019 в 20:50
поделиться

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

>>> (1).__add__(2)
3
20
ответ дан 26 November 2019 в 20:50
поделиться

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

21
ответ дан 26 November 2019 в 20:50
поделиться

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

0
ответ дан 26 November 2019 в 20:50
поделиться

Хотя в 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 имеют тенденцию расти за счет добавления глобальных функций в данный модуль.

Таким образом, Python, эквивалентный тому, что вы написали в своем вопросе, будет выглядеть следующим образом:

(5).__add__(6)

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

foo(5)

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

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

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

Object.foo(5)

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

Таким образом, Python, эквивалентный тому, что вы написали в своем вопросе, будет выглядеть следующим образом:

(5).__add__(6)

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

foo(5)

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

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

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

Object.foo(5)

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

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

Ruby эффективно делает следующее:

Object.foo(5)

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

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

Ruby эффективно делает следующее:

Object.foo(5)

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

40
ответ дан 26 November 2019 в 20:50
поделиться