По мере погружения в язык Python мы будем находить множество удивительных аспектов. Например, что значит расхожая фраза «В Python все является объектом»? Поскольку это объектно-ориентированный язык, то в нем и правда все является объектом, каждое целое число, строка, список и функция. Но прежде чем обсуждать, как такое возможно, давайте разберем, что такое объект.
Что такое объект?
Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по Python.
В объектно-ориентированных языках программирования, таких как 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?«