Представьте себе галактику, а внутри нее множество планет, звезд и естественных спутников с разными свойствами. Детализируя каждую из этих вещей, мы обнаружили, что каждая из них имеет разные атрибуты, такие как: кислород, вода, животные, энергия, микроорганизмы и т. Д. Как это происходит с галактикой, когда мы говорим о подходе ООП в Python (язык который поддерживает несколько парадигм программирования) у нас есть разные классы и что каждый класс имеет разные атрибуты. Таким образом, планета, звезда и естественный спутник являются классами галактики, а все компоненты галактики - объектами своего соответствующего класса. Как и в галактике, все в Python является объектом.

Идентификатор и тип

До сих пор мы знали, что такое классы и объекты, и, возможно, вы могли бы спросить себя… как я могу узнать, к какому классу принадлежит тот или иной объект? а может ... где в памяти находится какой-то объект? Если нет, начните спрашивать себя, потому что это основные вопросы, которые вы должны задать себе, чтобы понять, почему все в Python является объектом.

Возможно, как можно догадаться, id означает идентичность, и в данном случае это относится к идентичности объекта. И поскольку идентификатор уникален для каждого созданного объекта, он доступен во время использования объекта. Подождите, но что означает «доступен, пока объект используется»… давайте посмотрим на пример:

После создания этой переменной, которая указывает на объект, принадлежащий классу str, мы печатаем ее идентификатор, и теперь, когда этот объект хранится в памяти:

Итак, теперь мы знаем, что объект str является хранилищем, но что произойдет, если мы удалим ссылку на этот объект и снова попытаемся напечатать идентификатор объекта «Земля»? Посмотрим:

Как видите, идентификатор больше не доступен. Таким образом, это предложение «доступен, пока объект используется» означает, что идентификатор объекта будет доступен, пока объект имеет хотя бы одну ссылку на него. Эта волшебная вещь возможна благодаря совершенству Python и его технике, называемой Подсчет ссылок, при которой объекты освобождаются из памяти, когда на них нет ссылки в программе. . И как этот метод работает ... ну, как мы говорим, поскольку мы начинаем все в Python, это объект, и в данном случае «Земля» как объект имеет поле под названием счетчик ссылок, которое увеличивать или уменьшать в зависимости от того, создается или удаляется ссылка на объект.

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

Изменяемые и неизменяемые объекты

Когда мы начинаем говорить об объектах в Python, мы должны понимать, что есть два типа: Mutable и Immutable. Чтобы понять эту концепцию, давайте сначала обсудим разницу между этими двумя словами. Изменяемый означает, что что-то может быть изменено с течением времени, с другой стороны, неизменяемость - это наоборот. Итак, перенося это в контекст объектов Python, мы получаем, что изменяемый объект - это тот, значение которого может быть изменено во время выполнения программы, а неизменяемые не могут изменять свое значение.

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

Там мы создаем неизменяемый объект под названием «Земля», затем печатаем его тип:

И после этого мы пытаемся изменить его значение:

Как видите, из-за типа объекта изменить его значение невозможно. Теперь вы могли бы сказать: «Эй, подождите, я могу изменить его значение, вам просто нужно написать name = Mars».

Помните, когда мы говорим, что объект является неизменяемым или нет, мы говорим о присваивании без ссылки. А что такое присвоение и реферирование? присвоение - это когда вы берете переменную и пытаетесь изменить значение объекта, на который указывает, например:

С другой стороны, ссылка - это когда вы помещаете ту же переменную, чтобы она указывала на другой объект, например:

Итак, учитывая это, мы можем прийти к выводу, что когда объект изменяемый, я могу выполнять как присваивание, так и ссылку. В противном случае с неизменяемыми я могу просто сделать ссылку. Давайте посмотрим на несколько практических примеров использования этой концепции в изменяемых объектах:

Сначала мы ссылаемся на объект списка с помощью имени переменной.

Затем мы назначаем первую позицию в списке, и, как вы можете видеть каждый раз, когда мы назначаем изменяемый объект позиции в изменяемом объекте, мы также создаем новую ссылку в этой позиции. Если мы назначаем неизменяемый объект изменяемому объекту, мы просто присваиваем значение неизменяемого объекта указанной вами позиции, это можно увидеть в следующем примере:

Выходом в этом случае является присвоение 1 первой позиции списка:

Макросы Python, NSMALLPOSINTS против NSMALLNEGINTS

Наконец, в качестве любопытного факта давайте обсудим NSMALLPOSINTS и NSMALLNEGINTS. Эти макросы установлены в классе int с целью создания наиболее часто используемых объектов int (массив int). Так в основном используется для быстрого доступа к этим целым числам. Объекты выделяются при инициализации макросов NSMALLPOSINT и NSMALNEGINTS.