Объекты, классы и методы¶
Автор(ы)
ООП: Объектно-Ориентированное Программирование¶
Что же такое объектно-ориентированное программирование? Судя по названию, ключевую роль здесь играют объекты, на которые ориентируется дальнейший процесс программирования. Если взглянем на реальный мир, то для нас он предстанет в виде множества объектов, обладающих определенными свойствами, взаимодействующих между собой и вследствие этого изменяющимися. Эта привычная для взгляда человека картина мира была перенесена в программирование. Python - это объектно-ориентированный язык программирования, и всё в нем является объектами.
Объект - это набор данных и инструкций в памяти компьютера, в том числе:
- тип объекта
- данные, формирующие объект (контент внутри него)
- методы
Как определить тип уже знаем. И с объектами на самом деле знакомы с самого начала - ведь даже целочисленная переменная 5
, имеющая type(5) = int
, представляет собой объект.
Напомним
Методы - это те же функции, только существующие не сами по себе, а являющиеся частью класса.
Метод append имеет тип <built-in method append of list object at 0x7f1a38036e40>
Значение атрибута: Built-in mutable sequence.
If no argument is given, the constructor creates a new empty list.
The argument must be an iterable if specified.
list
- это класс, и в первой строчке кода выше создается объект, или экземпляр класса example_list
. Он хранит свой набор данных (контент). Метод append
общий для всех списков, однако меняет только конкретный экземпляр. Обратим внимание: этот метод ничего не возвращает, он меняет сам объект и его контент. Не все методы работают схожим образом, и придется запоминать принцип работы самых распространенных методов. К примеру, сложение чисел или строк внутри Python также осуществляется с помощью методов, однако это не меняет саму переменную, как было рассказано в более ранних лекциях:
Конкретно в данном случае логика работы обусловлена свойствами mutable
/immutable
объектов, о чём также упоминалось в одной из предшествующих лекций. int
неизменяем, и потому при вызове метода сложения возвращает новый объект - ведь самого себя изменить не получится. list
же может меняться, и append
меняет содержимое inplace
.
Определение классов¶
Давайте попробуем создать свой первый класс:
example_list.content = ['что-то', 'с']
example_list.content = ['что-то', 'с', 'чем-то']
type(example_list) = <class '__main__.List'>
После простого сложения: a.value = 3, b.value = 4
После записи в переменную результата: c.value = 7
Что важно заметить и отметить в этом примере:
-
Как объявить класс? С помощью ключевого слова
class
, указания названия класса (таким образом создается новый тип данных) и перечисления методов: -
Обязательно определить метод
__init__
. Это метод, вызываемый при создании нового объекта класса и отвечающий за определение его контента. В нем через запятую, как и в обычной функции, перечислить необходимые переменные и, по возможности, их значения по умолчанию. -
Каждый метод должен первым аргументом принимать экземпляр объекта (по соглашению он называется
self
). При этом при вызове метода Python автоматически подставит сам объект, делать это руками не нужно. По сути под капотом происходит следующее: -
Атрибутом называется переменная, хранящаяся в экземпляре класса.
- В рамках методов атрибуты объекта доступны с использованием ключевого слова
self
. К примеру,self.data
. - Вне методов атрибуты доступны у экземпляров через точку:
some_object.attr_name
. - Для создания объекта класса нужно указать имя класса (типа) и передать аргументы:
Int(3)
- как раз оно. - Методы как могут возвращать что-либо (в том числе новый объект того же класса), так и ничего не возвращать.
В заключение еще одна картинка, иллюстрирующая суть класса, экземпляра, атрибутов и методов:
Пример использования для хранения состояние¶
Допустим, есть некоторая среда, заданная состоянием, и есть объекты, существующие в этой среде, как-то взаимодействующие между собой (и со средой). Есть набор функций, который осуществляет эти взаимодействия. Тогда удобно ввести некоторый объект system
класса System
, который хранит эту информацию, и передавать его как параметр в методы расчета чего-либо (никакой конкретной логики тут не заложено, не пытайтесь понять, за что отвечает alpha
и прочие переменные - пример абстрактный):
Состояние системы на итерации 1: [9.64, 28.92, 40.00600000000001, 0.0]. Всего объектов: 5 Суммарная энергия объектов: 10
Состояние системы на итерации 2: [-340.36, -321.08, -309.994, -350.0]. Всего объектов: 4 Суммарная энергия объектов: -72.56
Состояние системы на итерации 3: [-340.36, -321.08, -309.994, -350.0]. Всего объектов: 3 Суммарная энергия объектов: -114.84
Обратите внимание на то, что функция one_system_cycle
не возвращает system
- ведь прямо во время итераций меняем ее состояние, и в последующие моменты времени эти изменения сохраняются, то есть состояние остается. Таким образом, эту систему (среду) - а именно объект, экземпляр класса System
- как параметр можно передавать в десятки функций, и каждая из них будет видеть актуальное состояние.
Что узнали из лекции¶
- объекты одного класса отличаются между собой атрибутами, которые придают уникальности;
- методы классов позволяют описывать логику взаимодействия, обновлять состояние;
- для объявления класса нужно определить как минимум один метод
__init__
; - классы без методов можно использовать как удобное хранилище разнородной информации о схожих объектах (описать разных студентов и их оценки).
Это далеко не все, что можно написать по теме классов и объектов, однако это тот необходимый минимум, что потребуется для ознакомления. Больше примеров и деталей можно найти, например, по ссылкам: