Начало работы. Объектно-ориентированное программирование, или ООП, — это парадигма программирования, в которой можно структурировать программы таким образом, чтобы свойства и поведение объединялись в объекты и их взаимодействия.

Например, объект может представлять собой круг со свойством радиуса, с такими поведениями, как вычисление площади, вычисление окружности, вычисление объема и т. д. Или электронное письмо со свойствами, такими как список получателей, тема, тело и т. д., и поведением, таким как добавление вложений. и отправка.

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

id и Type
id() — это встроенная функция, которая дает нам возможность проверить уникальный идентификатор объекта или личность или его адрес в памяти. «Эта идентичность должна быть уникальной и постоянной для данного объекта в течение времени жизни, если два объекта с непересекающимся временем жизни могут иметь одинаковый id()», . Мы обсудим это позже.

Возьмем пример со строковым объявлением:

>>> str1 = "geek"
>>> print(id(str1))
>>> print(type(str1))
2544105195536
<class 'str'>

В этом случае идентификатор переменной str1 равен 2544105195536. Это значение зависит от архитектуры, в которой работает интерпретатор Python.

Тип объекта — это, ну… его тип. Чтобы проверить тип объекта, мы можем передать его функции type(). Давайте посмотрим на нашу переменную str:

>>> type(str1)
<class 'str'>

Здесь мы видим, что функция возвращает не просто str, как ожидалось, а class ‘str’. В Python нет встроенных типов данных, как в C или других языках программирования. Типы на самом деле являются классами, и каждая переменная является экземпляром соответствующего класса. Итак, в нашем случае str является экземпляром класса str.

Примечание. оператор is отличается от оператора ==. Первый оценивает, указывают ли два имени на один и тот же объект в памяти, а второй оценивает, имеют ли они одинаковое значение.

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

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

>>> color = ["Holberton", "School", "Eterna primavera"]
>>> print(color)
>>> color[0] = "Cali"
>>> color[-1] = "Bogota"
>>> print(color)
['Holberton', 'School', 'Eterna primavera']
['Cali', 'School', 'Bogota']

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

Это встроенные типы, такие как int, float, bool, string, unicode, tuple. Проще говоря, неизменяемый объект нельзя изменить после его создания.
Например:

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

Как Python их обрабатывает и почему это важно:

Доступ к неизменяемым объектам быстрее, а их изменение обходится дорого, поскольку требует создания копии. тогда как изменяемые объекты легко изменить. Изменяемые объекты рекомендуются там, где есть необходимость изменить размер содержимого объекта.

Примечание. Кортеж состоит из строки и списка. Строки неизменяемы, поэтому мы не можем изменить их значение. Но содержимое списка может измениться. Сам кортеж не является изменяемым, но содержит изменяемые элементы.

Как аргументы передаются функциям и что это означает для изменяемых и неизменяемых объектов

В языке программирования C передача аргументов функции работает примерно так же, как указатели, и это поведение похоже на python. Переменные в Python хранят адрес (или идентификатор) объекта, на который они ссылаются.

При этом аргумент передается по ссылке в функцию. Это означает, что мы фактически не передаем объекты функциям, мы передаем им ссылки . В общем случае функция работает следующим образом: она имеет имя и либо принимает аргументы, либо не принимает их, выполняет блок операторов и завершает работу. Поэтому, когда мы передаем аргументы, он показывает различное поведение в зависимости от изменчивости объекта, на который ссылается аргумент.

Изменяемый:

>>> def increment(n):
...   n.append([4])>>> L = [1, 2, 3]
>>> increment(L)
>>> print(L)
L = [1, 2, 3, 4]   # a changed!

Неизменяемый:

>>> def increment(n):
...   n += 1>>> a = 3
>>> increment(a)
>>> print(a)
a = 3   # a is still referring to the same object

Магия сложных предметов

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

#!/usr/bin/python3
def magic_string(lstr=[]):
    lstr.append("Holberton")
    return ", ".join(lstr)