Основы ООП в языке Python

Содержание:

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

Особенности ООП:

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

Python – высокоуровневый язык, который поддерживает ООП. Сама структура языка построена таким образом, что все данные в нем представлены в виде объектов.

Основы ООП в языке Python

Классы

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

Отношение «класс – объект» такое же, как, например, отношение «автомобиль – BMW». Для создания класса применяется идентификатор class. Возьмем в качестве примера простейший класс Pupil:

class Pupil:

name = «Tom»

age = 20

speciality = «Computer science»

def study(self):

print(«Учиться»)

def sleep(self):

print(«Спать»)

Name, age, speciality – атрибуты выше рассмотренного класса; study, sleep – методы. Аргумент self ссылается на объект, в котором вызывается метод, и говорит нам о том, что study и sleep – методы класса, а не просто процедуры.

Для использования атрибутов и методов класса следует создать его экземпляры (объекты):

std1 = Pupil();

std2 = Pupil();

При выводе на печать типа данных созданного нами объекта получим следующее:

print (type(std1))

<class ‘__main__.Pupil’>

Тип std1 относится к классу Pupil.

Чтобы получить доступ созданного объекта к атрибутам и методам, следует использовать оператор точку . :

std1.name = «John»;

std1.age = 21;

print (std1.name + » » + str(std1.age) + » » + std1.speciality)

std1.study()

  • John 21 Computer science

Учиться

Обратите внимание на то, что мы изменили атрибуты name, age экземпляра, устанавливаемые по умолчанию, speciality осталась без изменений.

Для того чтобы посмотреть все атрибуты и методы созданного объекта, можно воспользоваться функцией dir.

print(dir(std1))

Нетрудно заметить, что в список выдачи вошли недавно созданные пользовательские атрибуты и методы. Атрибут __dict__ – словарь – содержит в себе список всех пользовательских атрибутов.

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

# класс студент

class Pupil:

pupil_count = 0

def add_Pupil(self, name, age, speciality):

self.name = name

self.age = age

self.speciality = speciality

Pupil.pupil_count += 1

В данном случае атрибут класса – pupil_count; name, age, speciality – атрибуты экземпляра. Метод add_pupil() увеличивает атрибут pupil_count на 1.

Создадим несколько объектов класса Pupil с вызовом метода add_pupil():

std1 = Pupil()

std1.add_pupil(«Tom», 20, «Computer science»)

print(std1.pupil_count)

std2 = Pupil()

std2.add_pupil(«John», 21, «Math»)

print(std2.pupil_count)

  • 1

2

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

Конструкторы

Рассмотрим еще один пример, как можно создавать классы с определенными заранее характеристиками по умолчанию, используя метод __init__:

class Pupil:

#конструктор

def __init__(self, name, age, speciality):

self.name = name

self.age = age

self.speciality = speciality

std1 = Pupil(«Tom», 20, «Computer science»)

print(std1.name, std1.age, std1.speciality)

  • Tom 20 Computer science

Как только мы создаем std1, сразу же определяем для него значения полей name, age, speciality напрямую.

Динамические классы

При создании классов можно обойтись без объявления атрибутов и методов и добавить их потом с помощью ключевого слова pass:

def addPupil(self, name, age, speciality):

self.name = name

self.age = age

self.speciality = speciality

print (name + » » + str(age) + » » + speciality)

class Pupil:

pass

Pupil.add_pupil = addStudent

std1 = Pupil()

std1.add_pupil(«Tom», 20, «Computer Science»)

  • Tom 20 Computer Science

Статические методы

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

class Pupil:

@staticmethod

def study():

print(«Учить»)

std1 = Pupil()

Pupil.study()

std1.study()

  • Учить

Учить

Методы классов

Создаются с помощью ключевого слова @classmethod и могут быть вызваны внутри этого класса, а не только в контексте экземпляра:

class Pupil:

@classmethod

def sleep(cls):

print(«Спать»)

Pupil.sleep()

  • Спать

Основы ООП в языке Python

Основные принципы ООП в языке Python

Парадигма ООП построена на 3 основных принципах:

  • Инкапсуляция – сокрытие данных, т. е. классы не имеют прямого доступа к полям друг друга, а взаимодействие между ними осуществляется через публичные методы.
  • Наследование – название говорит само за себя. Дочерний класс наследует свойства и методы родительского, тем самым реализуя повторное использование.
  • Полиморфизм – это способность одного и того же объекта вести себя по-разному в зависимости от того, в контексте какого класса он используется. Полиморфизм связан с созданием перегружаемых виртуальных методов.

Рассмотрим на конкретных примерах, как все эти принципы реализованы в Python.

Инкапсуляция

Для того чтобы объявить метод приватным, достаточно перед именем написать нижнее подчеркивание:

Основы ООП в языке Python

Двойное подчеркивание при именовании переменной делает атрибут защищенным и доступным только внутри этого класса:

Основы ООП в языке Python

  • AttributeError: ‘Pupil’ object has no attribute ‘name’

Невозможно получить доступ к атрибутам класса Pupil.

Наследование

Возьмем несколько классов, один из которых наследует свойства другого:

class Pupil:

def __init__(self, name, age, speciality):

self.name = name

self.age = age

self.speciality = speciality

class Sophmore(Pupil):

year_of_educ = 2

std1 = Sophmore(«Tom», 20, «Computer science»)

print(std1.name, std1.age, std1.speciality)

Sophmore – дочерний класс – наследует атрибуты name, age, speciality родительского класса Pupil.

Помимо этого, в Python реализована поддержка множественного наследования. Например, можно создать родительский класс с несколькими потомками или дочерний с несколькими родителями.

Полиморфизм

Предполагает использование виртуальных методов, т. е. дочерние классы могут расширять и переопределять методы при решении одной и той же задачи.

class Pupil:

def study(self):

print(«Учить в зависимости от курса»)

class Sophmore(Pupil):

def study(self):

print(«Учить предметы для второго курса»)

std = Pupil()

std.study()

soph = Sophmore()

soph.study()

  • Учить в зависимости от курса

Учить предметы для второго курса

Изучить программирование Python в парадигме ООП вам помогут курсы DevEducation. Занятия ведут действующие программисты имеющие многолетний опыт за плечами. Обучение программированию на 80 % состоит из решения реальных практических задач, с которыми приходилось или приходится сталкиваться программистам в своей работе.

Присоединяйся к DevEducation — стань востребованным специалистом и построй карьеру в IT!