Объектно-ориентированное программирование в Python

В данной статье мы расскажем об объектно-ориентированном программировании(ООП) в Python и его фундаментальных концепциях.

Введение в ООП в Python

Python — это мультипарадигмальный язык. Это означает, что он поддерживает разные подходы к программированию.

Одной из наиболее популярных парадигм будет создание объектов. Она известна как объектно-ориентированное программирование(ООП).

Объект имеет в себя две характеристики:

  • атрибуты;
  • поведение;

Рассмотрим на примере:

Объект – это попугай:

  • имя, возраст, цвет являются атрибутами;
  • пение, танцы — это поведение;

Концепция ООП в Python направлена ​​на создание кода для многократного использования. Эта концепция также известна как DRY(Don’t Repeat Yourself).

В Python концепция ООП реализует пару принципов:

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

Класс

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

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

class Parrot: pass

Мы используем ключевое слово class для определения пустого класса Parrot. Из класса мы создаем экземпляр – объект определенного класса.

Объект

Объект — это экземпляр класса. В определении класса задается только описание объекта. Пример создания объекта класса Parrot:

obj = Parrot()

В данном случае obj будет объектом класса Parrot.

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

Пример 1. Создание класса и объекта в Python

class Parrot: # атрибут класса species = "bird" # атрибут экземпляра def __init__(self, name, age): self.name = name self.age = age# создаем экземпляр класс Parrotblu = Parrot("Blu", 10)woo = Parrot("Woo", 15)# получаем доступ к атрибутам классаprint("Blu is a {}".format(blu.__class__.species))print("Woo is also a {}".format(woo.__class__.species))# получаем доступ к атрибутам экземпляраprint("{} is {} years old".format( blu.name, blu.age))print("{} is {} years old".format( woo.name, woo.age))

Результат работы программы:

Blu is a birdWoo is also a birdBlu is 10 years oldWoo is 15 years old

Сначала мы создаем класс с именем Parrot. Далее мы определяем атрибуты. Они являются характеристикой объекта.

Далее мы создаем экземпляры класса Parrot. В данном случае blu и woo являются ссылками на новые объекты.

После этого мы получаем доступ к атрибуту класса при помощи __class __.species. Атрибуты класса одинаковы для всех его экземпляров. Точно так же мы получаем доступ к атрибутам экземпляра, используя blu.name и blu.age. Но атрибуты экземпляра уникальны для каждого экземпляра класса.

Способы

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

Пример 2: Создание способов в Python

class Parrot: # атрибуты экземпляра def __init__(self, name, age):   self.name = name self.age = age        # способ экземпляра def sing(self, song):        return "{} sings {}".format(self.name, song)    def dance(self):        return "{} is now dancing".format(self.name)# создаем экземпляр объектаblu = Parrot("Blu", 10)# вызываем способы экземпляраprint(blu.sing("'Happy'"))print(blu.dance())

Результат работы программы:

Blu sings 'Happy'Blu is now dancing

В приведенном выше примере мы определяем два способа sing() и dance(). Их называют способами экземпляра, поскольку они вызываются для экземпляра объекта, то есть для blu.

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

Наследование — это метод создания нового класса на основе старого. Новый класс будет производным классом(дочерним). Существующий класс будет базовым классом(родительским).

Пример 3: Использование наследования в Python

# родительский классclass Bird:        def __init__(self):        print("Bird is ready")    def whoisThis(self):        print("Bird")    def swim(self):        print("Swim faster")# дочерний классclass Penguin(Bird):    def __init__(self):        # вызов возможности super()        super().__init__()        print("Penguin is ready")    def whoisThis(self):        print("Penguin")    def run(self):        print("Run faster")peggy = Penguin()peggy.whoisThis()peggy.swim()peggy.run()

Результат работы программы:

Bird is readyPenguin is readyPenguinSwim fasterRun faster

Сначала мы создали два класса: Bird(родительский класс) и Penguin(дочерний класс). Он наследует возможности родительского класса. Это прослеживается в способе swim().

Дочерний класс изменил поведение родительского класса – способ whoisThis(). Также мы расширяем родительский класс, создав новый способ run().

Мы используем возможность super() перед способом __init__(), чтобы извлечь содержимое способа __init__() из родительского класса в дочерний.

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

Используя ООП в Python, мы можем ограничить доступ к способам и переменным. Это предотвращает изменение данных вне класса. Такой подход называется инкапсуляцией. В Python мы устанавливаем приватный модификатор доступа, используя в виде префикса подчеркивание одинарное «_» или двойное «_ _» подчеркивание.

Пример 4: Инкапсуляция данных в Python

class Computer:    def __init__(self):        self.__maxprice = 900 def sell(self):        print("Selling Price: {}".format(self.__maxprice))    def setMaxPrice(self, price):        self.__maxprice = pricec = Computer()c.sell()# изменяем ценуc.__maxprice = 1000c.sell()# используем возможность сеттераc.setMaxPrice(1000)c.sell()

Когда мы запустим эту программу, результат будет следующим:

Selling Price: 900Selling Price: 900Selling Price: 1000

Сначала мы определили класс Computer. Далее использовали способ __init__() для хранения значения максимальной стоимости продажи компьютера.

Мы попытались настроить цену, но не смогли, так как Python рассматривает __maxprice, как приватные атрибуты. Чтобы настроить значение, мы использовали возможность сеттера. То есть, setMaxPrice(), которая принимает цену в виде параметры.

Полиморфизм

Полиморфизм — это способность использовать в ООП общий интерфейс для нескольких форм(типов данных).

Предположим, что необходимо раскрасить фигуру.  Есть пару вариантов фигуры(прямоугольник, квадрат, круг). Мы могли бы использовать тот же способ, чтобы закрасить любую форму. Эта концепция называется полиморфизмом.

Пример 5: Использование полиморфизма в Python

class Parrot:    def fly(self):        print("Parrot can fly")        def swim(self):        print("Parrot can't swim")class Penguin:    def fly(self):        print("Penguin can't fly")        def swim(self):        print("Penguin can swim")# общий интерфейсdef flying_test(bird):    bird.fly()#создаем объектыblu = Parrot()peggy = Penguin()# передаем объектыflying_test(blu)flying_test(peggy)

Результат:

Parrot can flyPenguin can't fly

Мы определили два класса: Parrot и Penguin. У каждого из них есть общий способ fly(), но они различные.

Чтобы реализовать полиморфизм, мы создали общий интерфейс. То есть, возможность flying_test(), которая может принимать любой объект. Далее мы передали объекты blu и peggy в возможность flying_test().

Преимущества использования ООП:

  • Программирование становится простым и эффективным.
  • Класс общий, так что код можно использовать повторно.
  • Производительность программистов увеличивается.
  • Благодаря абстракции данные становятся безопасными и надежными.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *