Почему все в Python является объектом?

По мере погружения в язык Python мы будем находить множество удивительных аспектов. Например, что значит расхожая фраза «В Python все является объектом»? Поскольку это объектно-ориентированный язык, то в нем и правда все является объектом, каждое целое число, строка, список и функция. Но прежде чем обсуждать, как такое возможно, давайте разберем, что такое объект.

Что такое объект?

Хотите скачать книги по Python в 2 клика? Тогда вам в наш телеграм канал PythonBooks 

В объектно-ориентированных языках программирования, таких как Python, объект – это сущность, которая содержит данные вместе со связанными с ними метаданными или функциями. Эти данные, содержащиеся в объекте, известны как атрибуты данных объекта. Атрибуты являются просто переменными, которые ссылаются на данные.

Процедуры или ряд действий, которые объект выполняет в определенном порядке или определенным способом, известны как методы. Методы объекта — это функции, которые выполняют операции над атрибутами данных объекта.

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

Но утверждение, что «Все в Python является объектом», также означает, что объект можно присвоить переменной или передать в качестве аргумента функции. Таким образом, объекты являются строительными блоками объектно-ориентированной программы.

Иными словами, программа, использующая объектно-ориентированную технологию, представляет собой набор объектов. Следовательно, программы, написанные на Python, также представляют собой набор этих объектов в виде переменных.

В общем, важно понять, что в Python строки — это объекты, списки — это объекты, функции — это объекты, и даже модули — это тоже объекты.

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

В Python почти все является объектом, будь то число, функция или модуль. Python использует чистую объектную модель, где классы являются экземплярами метакласса type. При этом термины «тип» и «класс» являются синонимами, а type — это единственный класс, который является экземпляром самого себя.

Эта объектная модель может быть полезна, когда нужна информация о какой-нибудь конкретной сущности в Python. Функции type() или dir() работают практически со всем, что есть в языке Python, за исключение ключевых слов if, def, global.

От редакции Pythonist: о функции type() у нас есть отдельная статья — «Функция type() в Python».

Итак, давайте на конкретных примерах посмотрим, что означает выражение «Все в Python является объектом».

Рассмотрим следующий код:

x = 4
type(x)

# Результат
# int

x = 'hello'
type(x)

# Результат
# str

x = 3.14159
type(x)

# Результат
# float

Мы очень хорошо знаем, что в Python есть типы данных. Однако они связаны не с именами переменных, а с самим объектом.

Раньше в объектно-ориентированных языках программирования объект представлял собой сущность, содержащую данные вместе со связанными метаданными и/или функциями.

В Python все является объектом, а значит, каждая сущность имеет некоторые метаданные, называемые «атрибутами», и связанные с ними функции, называемые «методами». Доступ к этим атрибутам и методам осуществляется с помощью синтаксиса точки.

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

L = [1, 2, 3]
L.append(10)
print(L)

# Результат
# [1, 2, 3, 100]

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

Например, числовые типы имеют атрибуты real и image, которые возвращают действительную и мнимую части значения, если рассматривать его как комплексное число.

x = 4.5
print(x.real, '+', x.image)

# Результат
# 4.5 + 0.0 i

Методы похожи на атрибуты, за исключением того, что они являются функциями, которые можно вызывать с помощью скобок. Например, для чисел с плавающей запятой есть метод is_integer, который проверяет, является ли значение целым числом.

x = 4.5
print(x.is_integer())

# Результат
# False

x = 4.0
print(x.is_integer())

# Результат
# True

Когда мы говорим, что все в Python является объектом, мы в буквальном смысле имеем в виду, что все является объектом — даже атрибуты и методы объектов сами по себе являются объектами с информацией о своем собственном типе:

type(x.is_integer())

# Результат
# biltin_function_or_method

Встроенные и пользовательские классы

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

Объявления этих объектов находятся в каталоге Include, и мы можем найти в Object различные реализации нескольких типов: int (Objects/longobject.c), str (Objects/unicodeobject.c), list (Objects/listobject.c), пользовательские классы (Objects/classobject.c), функции (Objects/funcobject.c), и так далее.

Каждый из этих файлов определяет экземпляр PyTypeObject, представляющий определенный тип данных. Каждый экземпляр PyTypeObject содержит в основном функции, описывающие поведение данного типа.

Например, tp_getattro и tp_setattro, когда они определены, являются функциями, которые позволяют соответственно читать и присваивать значение атрибуту. Отсутствие tp_setattro для типа int объясняет, почему невозможно добавить или изменить атрибут на целое число. tp_as_sequence и tp_as_mapping указывают на списки методов для обработки стандартных функций для функций и словарей.

Когда в программе определяется пользовательский класс, среда выполнения создает новый тип для этого класса.

FAQ

Что означают отступы в Python?

В большинстве случаев компиляторы или интерпретаторы не знают, как именно должны выполняться операторы в коде. Когда мы посредством отступов разделяем код на несколько блоков, это помогает им понять порядок, в котором должны выполняться эти блоки.

Что такое ключевые слова и идентификаторы в Python?

Ключевые слова — это зарезервированные слова с определенным значением. Идентификаторы — это определяемые пользователем имена для переменных, функций и так далее.

Приведите несколько примеров идентификаторов

flag, count_3, add_, sum1 являются примерами идентификаторов.

Приведите несколько примеров ключевых слов

if , not, assert, yield являются примерами ключевых слов.

Что такое переменная экземпляра класса?

Переменные, значения которых присваиваются внутри метода инициализации (конструктора) или метода с self, называются переменными экземпляра класса.

Заключение

Разобрав значение фразы «Все в Python является объектом», мы заключаем, что на самом деле объектно-ориентированное программирование — это способ мышления. Это метод для моделирования нашего кода в реальности, и благодаря этому его намного легче читать.

Объекты — это довольно интуитивно понятный способ группировки похожих вещей путем определения шаблона их обобщенной концепции и связанных с ней атрибутов и методов. Таким образом, объект — это абстракция, которая позволяет нам программировать без необходимости вручную отслеживать каждую мелочь.

Объекты имеют две цели. Во-первых, они хранят данные и имеют функции для выполнения некоторой работы. Во-вторых, эти функции могут использоваться для изменений данных объекта.

Выражение «Все в Python является объектом» имеет смысл только тогда, когда мы переключаем наше сознание с языка C на язык Python. А если кто-то начинает изучение программирования с языка Python, ему всегда следует помнить об этом выражении, потому что в Python данные и соответствующие функции содержатся в объектах.

Мы можем это легко понять, рассмотрев пример с числами, поскольку число в C называется примитивом. Но в Python число — это объект, поскольку с ним можно манипулировать различными способами. Это число может быть «простым числом» или «четным числом», которое мы наделяем определенными функциями и свойствами.

Перевод статьи Vaibhav Agarwal «How everything in Python is an Object?«