Найти в Дзене
programmer's notes (python and more)

Начало ООП на Python. Приложение к видео 3

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Приложение к уроку

Начала ООП в Python

Если исходить из того, что в Python все является объектом, то объектно-ориентированным программированием мы занимались в течение всего вводного курса. Но хотелось бы и самим создавать классы и объекты этих классов. Вот сегодня этим и займёмся.

Начнём с очень простого примера. С пустого класса. Класс есть, но в нём ничего нет. Для этого используем пустой оператор pass. На основе данного класса создаются два объекта: st и st1.

Заодно вспомним функцию type(), которая возвращает тип переменной или другими словами класс данного объекта.

Текст программ см. ниже
Текст программ см. ниже
primer100.py

Результат выполнения

<class '__main__.student'>

Класс, как и ожидалось student. А что значит префикс __main__? Мы обратимся ещё к нему, но в другом курсе: Встроенные библиотеки. Но если по-простому, префикс указывает, что класс определен в главном модуле - основной программе. Если бы, класс был определён в другом модуле, например proga.py, мы бы получили

<class 'proga.student'>

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

Перейдём к рассмотрению полноценных классов, т.е. классов с содержимым.

Ниже представлена программа с классом student. В классе представлено два метода: set_fio() - задать ФИО студента, get_fio() - получить заданное ФИО. Самое главное здесь переменная self. Она указывает на текущий экземпляр объекта. Т.е. для каждого объекта будет свой указатель, он создается вместе с экземпляром класса - объектом. Соответственно self.fio - переменная доступная внутри экземпляра. Она создается автоматически, когда выполняется строка self.fio = fio. Когда мы вызываем метод конкретного объекта, то первым параметром всегда автоматически передается вот эта переменная self. При вызове она не указывается, но она всегда передаётся. А вот уже внутри метода мы используем self, для определения переменных именно данного объекта.

Текст программы см. ниже
Текст программы см. ниже
primer101.py

При выполнении программы получаем

Петров И.И.
Traceback (most recent call last):
File "/home/pirogov/Yandex.Disk/projects/programming/python/OOP2/./prog1.py", line 15, in <module>
print(st2.get_fio())
File "/home/pirogov/Yandex.Disk/projects/programming/python/OOP2/./prog1.py", line 8, in get_fio
return self.fio
AttributeError: 'student' object has no attribute 'fio'

Т.е. при вызове get_fio() для второго объекта возникает ошибка, так как мы не определили переменную fio для этого объекта. Это важный момент, стоит его хорошенько осмыслить.

Мы видим, что метод как обычная функция может иметь параметры (self - обязателен). Если внутри метода определить переменную без префикса self, то это будет обычная локальная переменная по отношению к данной функции - методу.

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

Особенность программы в том, что два метода tr() и get() вызываются через экземпляр объекта. Метод tocop() вызывается из другого метода. Для его вызова обязателен префикс self. В данном случае он заменяет префикс mn.

Текст программы см. ниже
Текст программы см. ниже
primer102.py

Результат выполнения программы

1067

И последний пример.

Здесь я несколько забегаю вперёд. Если определить переменную внутри класса, но вне методов, то такая переменная будет видна и доступна во всех методах и через экземпляр класса. Такого типа переменные называются статическими. Они хороши для того, чтобы синхронизировать работу методов в разных экземплярах класса. Доступ к этой переменной можно получить и через имя самого класса: univer. name.

Текст программы см. ниже
Текст программы см. ниже
primer103.py

Результат выполнения программы
Университет
Университет
Институт
Институт
Институт

Ну пока, всё!

Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Весной особенно хорошо идёт Python с не большой добавкой C, но не добавляйте C++ - это испортит блюдо
Весной особенно хорошо идёт Python с не большой добавкой C, но не добавляйте C++ - это испортит блюдо