Приветствую!
В этой статье речь пойдет о таких важных фундаментальных вещах как абстракция и инкапсуляция.
Абстракция - это метод описания какого-либо объекта, путем отброса маловажной части для описания этого самого объекта.
То есть, абстрагировать объект - значит отбросить неважные на этапе разработки части, чтобы увидеть понятную и важную картину объекта.
Обычно программисты используют этот приём при разработке своего проекта. Они не задумываются о всех методах объектов, а задумываются только над теми, которые важны для написания простого, красивого и элегантного проекта. Конечно, предположить будущую вариацию исхода событий проекта невозможно, да и не нужно! Так как это отнимает ценные ресурсы программиста, поэтому очень важно думать о ближайшем исходе событий, а не заглядывать на этапы деплоинга(deploy) проекта.
Вот например язык Python. Он является абстракцией аппаратного обеспечения компьютера.
Аппаратное обеспечение - самый низкий уровень абстрагирования, то есть самый непонятный, ведь в нем помимо наших заданных инструкций существуют и другие, не важные нам, инструкции.
А вот язык Python - самый высокий уровень абстракции, ведь для сложения каких то чисел или переменных нам надо написать несколько символов, но никак не кучу нулей и единиц, как аппаратное обеспечение привыкло считывать.
Ну или представьте автомобиль. Мы сидим за рулем на сиденье, зная, что у нас под рукой есть рукоятки для поворотников, промывки стекол и т.д
Для езды нам не нужно знать, например, что происходит с инжектором, дросселем, ну или же не надо знать всю структуру строения двигателя. Мы просто: схватились за руль, жмем на педали и мы в пути! ( не забудьте помыть стекло перед отъездом)
То есть, абстракция всего лишь метод продумывания реализации объектов с характерными для них свойствами, без углубления в более сложные, ненужные свойства.
На абстракции строятся 3 главных кита ООП.
Инкапсуляция:
Инкапсуляция - метод сокрытия данных от посторонних пользователей, где доступ к данным производится через специальный метод.
Этот метод позволяет защищать данные от постороннего вмешательства как со стороны пользователя, так и со стороны других программистов.
Например, вы создали "наикрутейший" алгоритм и хотите, чтобы никто им не воспользовался и никто не смог его украсть.
В Python такая схемка реализуема, но не так хороша, как в других языках.
Итак, здесь мы объявили функцию private_func, но в отличии от обычных функций, мы добавили нижнее подчеркивание в начало имени функции, говоря интерпретатору, что эта функция приватная! Поэтому у нас и вышла ошибка об отсутствии такой функции за пределами класса.
Заменив седьмую строчку на такой вывод через объект, мы смогли достать функцию и вывести предложение в консоль.
В таком большом коде я попытаюсь разъяснить еще больше интересных моментов, связанных с инкапсуляцией.
Во-первых, как видно из первых строк, я поставил уже двойные подчеркивания в названии атрибутов(переменных). Двойные подчеркивания - высшая сила приватности в инкапсуляции Python. То есть, эти атрибуты уже нельзя использовать и видоизменять за пределами класса Car(), а только можно вызывать через свойства.
Свойства - это специальные методы, которые ограничивают доступ к атрибутам, делая их приватными, то есть доступными только внутри класса где они объявлены.
В нашем коде функции get_speed и set_speed являются свойствами.
А также именно такие функции называют геттерами(get_speed) и сеттерами(set_speed). Сразу скажу, что они не являются особыми методами, как многие могли подумать, а являются лишь названиями.
С помощью метода сеттера мы задаём какие-то характеристики, в нашем случае скорость автомобиля, атрибутам. И, как вы могли заметить, сеттер перекрывает значение 1000, которое было задано с помощью init-а(конструктора класса).
С помощью метода геттера мы можем получать атрибуты из класса.
Также существует более элегантный и читабельный способ объявления методов геттера и сеттера - аннотации свойств.
(есть также и другие аннотации, о которых я, может быть, расскажу в будущем)
Я написал другой код, где главную роль будет играть Имя и возраст человека.
На 7 строчке я написал такую команду как @property. Эта команда значит, что я объявил геттер под именем age. Затем, перед следующей функцией я записал команду @age.setter, которая означает объявление сеттера под таким же именем что и геттер(запомните, что имена геттера и сеттера должны совпадать!).
Всю доподлинную информацию я буду выводить через метод infoAboutPerson().
Итак, статья насыщенная, поэтому не ленитесь, берите мой код и видоизменяйте его как вам угодно, чтобы все прочувствовать на практике. В следующей статье я расскажу о полиморфизме и наследовании.
Всем пока)