До сих пор на этом курсе мы усиленно изучали программирование на Питоне, но практически не задумывались над тем, как мы программируем и как мы организовываем код, который пишем. Все потому, что код, который мы создавали был очень прост.
Единственное, что мы довольно активно применяли — это функции. Они помогали нам выделить повторяющиеся части кода и в дальнейшем просто обращались к ним по имени.
При этом многие языки программирования (в том числе Питон) позволяют использовать подход, который существенно упрощает работу со сложно-структурированным кодом. Такой подход или парадигма называется объектно-ориентированным программированием (object-oriented programming, OOP).
Содержание занятия
- Понятие объектно-ориентированного программирования
- Классы и объекты в Питоне
- Создание класса и метод .__init__()
- Создание объекта
- Атрибуты класса
- Методы класса
- Инкапсуляция
- Наследование
- Полиморфизм
- Императивное и декларативное программирование
- Процедурное программирование
- Объектно-ориентированное программирование
- Функциональное программирование
- Готовые классы библиотеки sklearn
- Пример ООП: собственный класс линейной регрессии
- Пара важных деталей
- Вопросы для закрепления
Понятие объектно-ориентированного программирования
Отвлечемся на секунду от программирования. Представьте себе, что вам нужно создать множество фигурок кошек. Хотя все кошки разные, у них все же есть нечто общее.
Python с нуля. Урок 10 | Классы и объекты
- Во-первых, у них есть общие свойства, например, шерсть, когти и хвост.
- Кроме того, любая кошка может выполнять определенные действия: лазить по деревьям, мяукать и потягиваться.
Если мы хотим максимально сэкономить время при рисовании кошек, то будет логично создать шаблон условной кошки, а затем копировать этот шаблон и дополнять нужными нам свойствами и положениями.
Так вот объектно-ориентированное программирование предполагает, что вначале мы создаем шаблон нужного нам предмета (назовем его классом, class), а затем на основе шаблона создаем конкретный предмет (назовем его объектом, object).
Причем тип животного или цвет шерсти станут атрибутами (attribute) такого объекта, а способность выполнять определенные движения — методами (method).
По большому счету в этом и заключается суть программирования, ориентированного на объект. Наши программы теперь состоят не из последовательных команд, а представляют собой объекты.
Посмотрим как это можно реализовать на Питоне.
Что такое класс. Что такое объект класса. Экземпляр класса это. Класс ООП это. Урок #73
Классы и объекты в Питоне
Создание класса и метод .__init__()
Класс в Питоне создается с помощью ключевого слова class, названия класса и двоеточия. Внутри класса необходимо прописать метод .__init__(), который будет создавать или инициализировать (initialize) объект этого класса. Методы прописываются через ключевое слово def.
Дополнительно метод .__init__() нужно снабдить аргументом, его принято обозначать словом self, который при создании объекта будет ссылаться на этот же объект (то есть по сути сам на себя, отсюда и выбор такого названия).
# создадим класс CatClass
class CatClass :
# и пропишем метод .__init__()
def __init__ ( self ) :
Оператор pass мы указали, потому что метод класса, как и тело функции, нельзя оставлять пустым. Теперь давайте создадим или инициализируем объект созданного класса.
Создание объекта
Для того чтобы создать объект, запишем наш класс в переменную. Пусть это будет Matroskin. Дополнительно проверим тип данных новой переменной.
# создадим объект Matroskin класса CatClass()
Matroskin = CatClass ( )
# проверим тип данных созданной переменной
type ( Matroskin )
__main__.CatClass
Классы и функции
Что и когда лучше использовать, чтобы писать хороший код.
Готовые программы включающие функции объекты и классы это
В результате будет создан файл .cs с именем класса Phone . В нём будет объявлен класс с помощью ключевого слова class и объявление класса может иметь следующий вид:
В результате выполнения выведены значения полей и отработаны методы класса. Но для более эффективного программирования классов используются конструкторы.
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека шарписта»
Конструкторы
Конструктор – метод, имеющий имя класса, который используется для создания и инициализации объектов. Конструктор вызывается при создании объекта класса и его можно использовать для инициализации начальных значений полей.
Существуют следующие типы конструкторов:
- конструктор без параметров;
- параметризованный конструктор;
- конструктор по умолчанию.
Конструктор по умолчанию создается в языке C#, если в классе не реализованы конструкторы.
Имя конструктора должно совпадать с именем класса и не может иметь тип возвращаемого значения.
Модифицируем класс Phone , добавив в него конструктор без параметров и с параметрами:
Конструкторы, как и другие методы можно перегружать, используя разные параметры.
Модификаторы доступа
Модификаторы доступа используется для установки уровня доступа/видимости для классов, полей, методов и свойств. К модификаторам доступа относятся такие ключевые слова, как public , private , protected и internal , ранее использовался нами только public .
Модификатор | Описание |
public | Код доступен для всех классов |
private | Код доступен только в пределах одного класса |
Protected | Код доступен в пределах одного класса или в классе, который наследуется от этого класса |
Internal | Код доступен только в пределах собственной сборки, но не из другой сборки |
Если мы объявим поля нашего класса Phone или методы как private , то они станут недоступны для использования в других классах, например в Program . Ограничение доступа и является основой принципа ООП – инкапсуляции.
Инкапсуляция и свойства
Инкапсуляция позволяет скрыть конфиденциальные данные от пользователей. Чтобы достичь этого, необходимо:
- объявить поля/переменные как private ;
- обеспечить public get и set методы через свойства для доступа и изменения значения private поля.
Доступ к private переменным возможен только внутри одного и того же класса. Иногда нужно получить к ним доступ вне класса – и это можно сделать с помощью свойств.
Свойство похоже на комбинацию переменной и метода и имеет два метода: get() и set() .
Поля можно сделать доступными только для чтения, используя get() или только для записи, используя set() .
C# позволяет использовать автоматические свойства, где не нужно определять поле для свойства, а достаточно написать get; и set; внутри свойства. Изменив класс Phone , следующим образом:
Результат показывает, что класс Smartphone успешно унаследовал от класса Phone поля и метод.
Наследование позволяет существенно сократить объем кода, так как не требуется повторная реализация участков кода в других классах.
Полиморфизм и перегрузка методов
Принцип полиморфизма позволяет методам классов иметь не одну, а несколько форм, и он необходим, когда у нас есть много классов, связанных друг с другом путем наследования.
Как было сказано выше, наследование позволяет наследовать поля и методы от другого класса. Полиморфизм использует эти методы для выполнения различных задач. Это позволяет нам выполнять одно и то же действие разными способами.
Например, базовый класс Device , у которого есть метод enabledScreen() . Производными классами устройств могут быть смартфоны, планшеты и у них также есть собственная реализация вывода информации на экран:
Все объекты успешно выполнили свои методы, благодаря их перегрузке.
Абстрактные классы и методы
Абстракция данных – это процесс сокрытия определенных деталей и показа пользователю только важной информации. Абстракция может быть достигнута либо с помощью абстрактных классов, либо с помощью интерфейсов.
Ключевое слово abstract используется для классов и методов:
- абстрактный класс – это ограниченный класс, который нельзя использовать для создания объектов (для доступа к нему он должен быть унаследован от другого класса);
- абстрактный метод: может использоваться только в абстрактном классе и не имеет тела. Тело предоставляется производным классом.
Абстрактный класс может иметь как абстрактные, так и обычные методы. Создавать объекты абстрактных классов нельзя. Для создания объектов должен использоваться класс наследник.
Рассмотрим на примере:
Создали список с элементами, добавили новый элемент, удалили его по индексу, перевернули список в обратном порядке. С остальными методами предлагаю поэкспериментировать самостоятельно.
Словарь
Класс Dictionary реализует структуру данных Отображение, которую иногда называют Словарь или Ассоциативный массив. Идея довольно проста: в обычном массиве доступ к данным мы получаем через целочисленный индекс, а в словаре используется ключ, который может быть числом, строкой или любым другим типом данных, который реализует метод GetHashCode() . При добавлении нового объекта в такую коллекцию для него указывается уникальный ключ, который используется для последующего доступа к нему.
Пустой словарь можно объявить так:
Продемонстрировано использование основных свойств и методов класса Dictoniary .
На этом мы завершаем вторую часть статьи, важно понять принципы ООП и в дальнейшем их корректно применять на практике.
Материалы по теме
- Руководство по С# для начинающих: массивы и цикл foreach
- 8 шагов от новичка до профессионала: дорожная карта разработчика на C#
- ТОП-10 книг по C#: от новичка до профессионала
Источник: proglib.io