Файл: Оглавление заданий.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 54

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


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

Иллюстрация этого положения представлена на рисунке 1.11.




Рисунок 1.11
Здесь B и С – объекты двух разных классов. B.слагаемое_1 и C.слагаемое_1-ссылки на атрибуты классов и возвращаю действительные числа.

B.сложить() и C.сложить() – тоже ссылки на атрибуты классов, они возвращают функциональные объекты, использующие нужные аргументы. Из приводимого рисунка видно, что документация к классу тоже является атрибутом по умолчанию имеющем имя __doc__ .

Обратите внимание на разницу в классах B и С. Интерпретатор предупреждает, что параметр «слагаемое_2» желательно заменить на «self» (рисунок 1.12). Но это не приводит к фатальной ошибке. Рекомендуемая замена (Рисунок 1.11) на 100% «устроила» интерпретатор (класс C на рисунке ). Смысл слова self будет рассмотрен позже, и он очень важный при программировании в парадигме ООП.


Рисунок 1.12. Реакция интерпретатора на имя параметра во внутренней функции класса
Итак, определение класса включает задание его имени и атрибутов, которые задаются своими именами. В рассмотренном выше примере имена слагаемое_1 и сложить – атрибуты класса B.

Атрибуты-переменные называют полями или свойствами. Полем является атрибут слагаемое_1. Атрибуты-функции называются методами. Методом в классе сложить является методом.

Определение классов должны быть выполнены до того, как их будут использовать. Эти определения могут быть помещены в ветвь оператора if либо внутрь какой-либо функции.

Внутри класса разрешены любые операторы, но чаще всего бывают определениями функций (методов). При вводе определения класса создаётся новое пространство имён, которое используется в качестве локальной области. Важно отметить, что
между именами переменных в разных областях видимости нет абсолютно никакой связи. Подробнее о пространстве имён и областях видимости можно прочитать в [1].

Представленный на рисунке пример не содержит создания экземпляров класса. Но можно в продолжение этого же проекта создать экземпляр класса B. При этом экземпляру передаётся соответствующее значение поля и метод, а затем распечатать передаваемые экземпляру из класса результаты (рисунок 1.13)





Рисунок 1.13


Подведём итог.

Класс — это объект, чьим типом является type (тип можно подсмотреть в атрибуте__class__).

Экземпляр некоторого класса A — это объект, у которого в атрибуте __class__ есть ссылка на класс A.

https://habr.com/ru/post/137415/ !!!!!!

1.10.2 Конструкторы класса в ООП. Особенности конструктора класса в Python

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

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

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

Можно создавать и свой конструктор. В разных языках ООП имеются свои особенности. Так в Java и C++ имя конструктора должно совпадать с именем класса. В Python роль конструктора выполняет метод __init()__ 2. Наличие пар подчёркивания спереди и сзади метода указывает на то, что этот метод принадлежит к группе перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.3

Необходимость и удобство использования конструкторов в ООП связана с тем, что при их использовании объекты класса получают свои свойства сразу.
В процессе использования конструктора надо знать ответы на несколько вопросов:

  • Может ли класс иметь несколько конструкторов?

  • Может ли класс-наследник иметь свой конструктор?

  • Как класс-наследник использует конструкторы своих предков?


Эти вопросы будут рассмотрены позже.


1.10.3 Определение (создание) экземпляра класса

Процесс создания экземпляра класса запускается каждый раз, когда вызывается объект-класс Python. Этот процесс можно представит в виде последовательности двух шагов:

  • Создание нового экземпляра целевого класса;

  • Инициализация нового экземпляра с соответствующим начальным состоянием.

Первый шаг в классах Python есть специальный метод .__new__(), который отвечает за создание и возврат нового пустого объекта. Затем другой специальный метод .__init__() принимает результирующий объект вместе с аргументами конструктора класса.
1.10.3.1 Атрибуты (поля) данных класса и его экземпляров

Атрибуты данных можно классифицировать двумя способами.

Во-первых, это атрибуты данных и методы класса. Во-вторых, их можно разделить на способы создания.

Атрибуты экземпляра класса создаются двумя способами:

  • либо берутся из атрибутов, задаваемых в соответствующем классе – назовём их атрибутами первой группы,

  • либо задаются во вновь создаваемом экземпляре класса непосредственно. Назовём их атрибутами второй группы.

Доступ к атрибутам первой группы вне тела класса осуществляется через точечную нотацию через объект объявления класса:

<Имя класса>.<Имя атрибута>.

Если этот атрибут — метод, то его вызывают по аналогии:

<Имя класса>.<Имя метода>([<Параметры>])

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

Чтобы создать экземпляр класса используется синтаксис:

<экземпляр класса> = <Название класса> ([<Параметры>]).

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

<экземпляр класса>.<Имя атрибута> = <Значение>


И по аналогии получать доступ к уже существующим атрибутам:

<экземпляр класса>.<Имя атрибута>.

При этом если не удается найти атрибут с таким именем у экземпляра, то поиск продолжается в атрибутах, принадлежащих классу.

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

На рисунке представлена иллюстрация приведённого правила (рисунок 1.14).






Рисунок 1.14. Пример атрибутов класса.
Все атрибуты класса в языке Python являются открытыми (public), т. е. доступными для непосредственного изменения как из самого класса, так и из других классов и из основного кода программы. Использование специального конструктора с «self» обеспечивает индивидуализацию указанного атрибута для каждого экземпляра класса.

Очень важно понимать разницу между атрибутами объекта класса (просто класса в классическом (не питоновском)варианте и атрибутами экземпляра класса.

Атрибут объекта класса существует в единственном экземпляре, доступен всем экземплярам класса, его изменение приведёт к изменению во всех экземплярах, что и показано на примере (рисунок 1.15). То есть его изменение транслируется во все экземпляры класса. Однако, если будут созданы одноимённые объекты в экземплярах класса4, то они будут самостоятельными для каждого объекта – то есть ссылаться на разные хранящие значения области памяти. Что и не удивительно, так имя атрибута является составным: имяКласса.имяАтрибута или имяЭкземпляра.имяАтрибута.

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

В том же скрипте отражены особенности использования метода «self» для атрибута атр_3.







Рисунок 1.15. Пример работы с локальными атрибутами.

Следует также учитывать, что в одном классе могут одновременно существовать атрибут объекта класса и атрибут экземпляра этого объекта с одним именем!
1.10.3.2 Встроенные атрибуты класса (объекта класса)

Каждый класс Python хранит встроенные атрибуты, и предоставляет к ним через оператор «точка» (.), как и любой другой атрибут:

  • __dict__ словарь, содержащий пространство имен класса.

  • __doc__— строка документации класса. None если, документация отсутствует.

  • __name__ — имя класса.

  • __module__ — имя модуля, в котором определяется класс. Этот атрибут __main__ в интерактивном режиме.

  • __bases__ — могут быть пустые tuple, содержащие базовые классы, в порядке их появления в списке базового класса.


Попробуйте распечатать значения этих атрибутов у описанного выше (на рисунке 1.15) класса.
1.10.3.3 Связь методов экземпляров класса и методов класса

Как было показано выше атрибуты данных в Python делятся на две категории: атрибуты объекта класса и атрибуты экземпляра этого объекта. А как обстоит дело с атрибутами-методами?

В принципе методы также можно разделить на такие же категории, но для атрибутов-методов экземпляров класса ситуация намного сложнее. Поэтому надо разбираться с ними постепенно и тщательно.


  • Рассмотрим простейший класс, содержащий свой метод – простую печать и посмотрим, как он работает (рисунок 1.16). Видим, что отдельный класс выполняется и работает, выполняя записанное в нём локальное действие, которое можно назвать методом класса.







Рисунок 1.16. Печать как результат метода класса

  • Добавляем в класс конструктор для будущих экземпляров, но не будем создавать ни одного экземпляра (рисунок 1.17). Этот конструктор будет выполняться при создании любого очередного экземпляра класса. Но без их создания он выполняться не будет, и поэтому печать, введённая в конструктор, выполняться не будет!

  • После создания двух экземпляров метод экземпляров срабатывают (рисунок 1.18)!