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

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

Это также полностью объектно-ориентированный язык. Каждый компонент программы Python является объектом класса. Число, строка, список, словарь и так далее.

Но что такое объект?
Это просто набор данных (переменных) и методов (функций), которые работают с этими данными. Класс, с другой стороны, является планом для этого элемента.

Давайте определим класс

Как и функции, определения начинаются с ключевого слова def в Python, определения классов начинаются с ключевого слова class.

class Human:
    '''
    This is a docstring.
    it is highly recommended that you put here a brief description    
    of the class
    '''
    pass

У классов также есть волшебные методы, которые начинаются с двойного подчеркивания, например, если мы хотим увидеть строку документации класса, мы можем сделать это с помощью Human.__doc__

У объекта есть две характеристики:

  • Атрибуты
  • Поведение

Давайте посмотрим поближе:

Атрибуты класса — это переменные, указанные непосредственно в классе и общие для всех объектов в классе. Доступ к характеристикам класса можно получить как через имя класса, так и через объекты.

Мы можем определить их следующим образом:

class Human:
    '''
    This is a docstring.
    it is highly recommended that you put here a brief description    
    of the class
    '''
    occupation = Student

Некоторые атрибуты относятся к экземпляру объекта и определяются методом-конструктором. Этот метод имеет специальное имя __init__() и специальный параметр self. Метод конструктора вызывается автоматически при создании экземпляра объекта класса.

class Human:
    '''
    This is a docstring.
    it is highly recommended that you put here a brief description    
    of the class
    '''
    occupation = Student
    __init__(self): #Constructor method
        self.name = Daisy #instance attribute
        self.age = 24 #instance attribute
        self.gender = Women #instance attribute

Мы определяем поведение нашего объекта с помощью методов, это функции, которые мы создаем внутри нашего класса.

class Human:
    '''...'''
    occupation = Student
    __init__(self): #Constructor method
        self.name = Daisy #instance attribute
        self.age = 24 #instance attribute
        self.gender = Women #instance attribute
    def listen_to_music(self, song):
        return "{} is listening {}".format(self.name, song)
    def running(self, km):
        return "{} is running {}".format(self.name, km)
    def sing(self, song):
        return "{} is singing {}".format(self.name, song)
    def skate(self):
        return "{} is skating".format(self.name)

Могу ли я изменить его атрибуты без каких-либо проблем?

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

Неизменяемые объекты. Это встроенные типы, такие как int, float, bool, string, Unicode, tuple.

Что произойдет, если мы попытаемся изменить его?

tuple = (0, 1, 2, 3)
tuple[0] = 4
print(tuple1)
--------------------------------------------------------
Error:
TypeError: 'tuple' object does not support item assignment

Это возвращает ошибку, указывающую, что этот тип данных не может быть изменен.

Изменяемые объекты. Это типы list, dict, set. Пользовательские классы обычно изменяемы.

color = ["red", "blue", "green"]
print(color)
color[0] = "pink"
color[-1] = "orange"
print(color)
--------------------------------------------------------
['red', 'blue', 'green']
['pink', 'blue', 'orange']

Тогда как я могу узнать его тип данных или идентификатор?

Встроенная функция id() возвращает целое число, представляющее идентификатор объекта. Это целое число обычно соответствует расположению объекта в памяти, но оно зависит от реализации Python и платформы. Оператор is сравнивает идентификаторы двух объектов.

str1 = "PythonIsCool"
str2 = "PythonIsCool"
print(id(str1))
print(str1 is str2)
--------------------------------------------------------
140252505691448
True

Встроенная функция type() возвращает тип объекта. Давайте посмотрим на простой пример

str1 = "PythonIsCool"
print(type(str1))
--------------------------------------------------------
<class: 'string'>

Помните, что знание разницы между изменяемыми и неизменяемыми типами данных и передача этих типов данных функциям оказывает положительное или отрицательное влияние на управление памятью.

Когда мы предполагаем, что переменная имеет значение, мы делаем это как присваивание; H. Мы объявляем информацию, которую он будет содержать непосредственно, следующим образом.

musical_genres = ["Rock", "Reggae", "Jazz"]

У нас уже есть переменная с информацией; также возможно присвоить переменные другим переменным, которые уже существуют. В результате, как показано ниже, все переменные связаны с одним и тем же объектом.

musical_genres = ["Rock", "Reggae", "Jazz"]
musical_genres_2 = musical_genres
>>> print(musical_genres)
["Rock", "Reggae", "Jazz"]
>>> print(musical_genres_2)
["Rock", "Reggae", "Jazz"]

Поскольку две переменные ссылаются на один и тот же объект, при изменении объекта все ссылки также изменятся:

>>> musical_genres.append("Blues")
>>> print(musical_genres)
["Rock", "Reggae", "Jazz", "Blues"]
# Now let's look at another reference
>>> print(musical_genres_2)
["Rock", "Reggae", "Jazz", "Blues"]

Присвоение переменной b переменной a приводит к тому, что переменные ссылаются на один и тот же объект в системной памяти, в то время как присвоение c переменной an или b просто приводит к тому, что третья переменная ссылается на тот же объект. Любое изменение объекта (также известное как мутация) отражается во всех связанных переменных (a, b и c).

Псевдоним возникает, когда изменения одной переменной влияют на другую, поскольку обе они относятся к одному и тому же объекту.

О памяти

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

Для улучшения управления памятью и эффективности CPython предварительно выделяет несколько крошечных целых чисел, поскольку они используются чаще всего, и будет использовать их повторно, а не создавать дубликаты. Числа от -5 до 256 предварительно выделены в Python 3.4.

Эти 262 числа представляют собой структуру, которая используется для простого извлечения этих целых чисел. Они выделяются только при инициализации NSMALLPOSINTS и NSMALLNEGINTS.

#define NSMALLPOSINTS           257
#define NSMALLNEGINTS           5

Проверив идентификаторы номеров, вы можете увидеть номера, которые были предварительно выделены. Идентификатор объекта — это, по сути, его адрес в памяти:

>>> hex(id(1))
'0x10dc0c930'
>>> hex(id(2))
'0x10dc0c950'

Библиография

tutorialsteacher, Programiz, pythonlikeyoumeanit, python.org, pythoninternal