Концепции ООП

Мы разберем три основных концепции ООП. И хотя мы не будем в полной мере их использовать в рамках нашего курса, тем не менее знать об их существовании необходимо.

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

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

За чем использовать наследование?

Предположим что у нас есть один большой класс «Транспорт». В классе описываются базовые характеристики для всех транспортных средств:

  • поля: скорость, вес, запас хода и тому подобное;
  • методы: получение информации из полей, установка новых значений;
  • конструктор: пустой и по установке всех полей.

На основе класса мы спокойно можем создать объект легковой машины, объект грузовика, объект самолета и так далее. У всех объектов будут одинаковые характеристики и методы.

Мы явно понимаем, что у объекта машина и самолёт будут разные поля и характеристики. Как можно поступить:

  1. Можно создать два отдельных класса: «Car» и «Airplane». В каждом классе будут все методы, поля и конструкторы повторно переписанные из класса «Транспорт», а также будут новые методы, что важны только для конкретного класса;
  2. Можно создать два класса наследника: «Car» и «Airplane». Оба класса будут наследовать всё от класса «Транспорт» и при этом будут содержать свои дополнительные функции. Таким образом повторения кода не будет и код станет меньше и чище.

Создание классов наследников

Для создания класса наследника требуется создать класс и указать наследование от главного класса.

Пример класса наследника:

class Cars:
    wheels = 4 # Общее значение для всех объектов,
    # так как все машины имеют колеса

class BMW (Cars):
    is_m_serias = true # Является ли модель "М" серии?
    # Переменная нужна только в классе BMW

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

Инкапсуляция позволяет ограничить доступ к какой-либо функции в классе. Благодаря такому подходу злоумышленники или же мы сами не сможем случайно или намерено вызвать или изменить метод.

Пример:

class Some:
    def __printWords(self):
        print ("Попробуй меня вызвать")

obj = Some()
obj.__printWords() # Вызов функции ничего не даст

Если метод класса начинаеться с __то такой метод или являеться приватным и его не возможно вызвать. Тоже правило работает и для атрибутов класса.

Полиморфизм

Полиморфизм позволяет одинаково обращаться с объектами, имеющими однотипный интерфейс, независимо от внутренней реализации объекта. Например, с объектом класса “грузовой автомобиль” можно производить те же операции, что и с объектом класса “автомобиль”, т.к. первый является наследником второго, при этом обратное утверждение неверно (во всяком случае не всегда). Другими словами полиморфизм предполагает разную реализацию методов с одинаковыми именами. Это очень полезно при наследовании, когда в классе наследнике можно переопределить методы класса родителя.

Пример:

class Cars:
    def nothing(self): # Пустая функция
        pass

class BMW (Cars):
    def nothing(self, word):
        print (word + "!") # Функция теперь будет работать по новому

a = BMW()
a.nothing("Some")

results matching ""

    No results matching ""