===== Объектно-ориентированное программирование ===== Объектно-ориентированное программирование (сокращенно ООП) — это парадигма разработки программных систем, в которой приложения состоят из объектов. Объекты — это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс Car (машина), а его экземплярами будут Toyota Corolla или Ford Focus. Свойства — это данные, которые связаны с конкретным объектом: * Объем двигателя * Габаритные размеры * Потребление топлива на 100км * Объем багажника * Цвет кузова * Максимальная скорость Поведение объекта определяется с помощью методов — специальных блоков кода, которые можно вызывать из разных частей программы. Например, у того же объекта Car могут быть следующие методы: * Завести двигатель * Заглушить двигатель * Ехать * Сигналить * Включить фары Используя эти свойства и методы, можно значительно ускорить разработку, сделать код более читаемым. К тому же самому программисту проще составлять код, если он думает с помощью объектов. То есть он не пишет какую-то функцию, которая будет делать что-то для программы в целом. Вместо этого он мысленно разделяет приложение на отдельные компоненты и продумывает их свойства и поведение. === Классы и объекты === Класс — это шаблон, описание какой либо сущности, а объект — это экземпляр конкретной сущности, созданный по шаблону. Самое простое объяснение: класс — это чертеж трансформера, а экземпляры этого класса — конкретные трансформеры, например, Оптимус Прайм или Олег. И хотя они и собраны по одному чертежу, умеют одинаково ходить, трансформироваться и стрелять, они оба обладают собственным уникальным состоянием. Состояние — это ряд меняющихся свойств. Поэтому у двух разных объектов одного класса мы можем наблюдать разное имя, возраст, местоположение, уровень заряда, количество боеприпасов и т. д. Само наличие этих свойств и их типы описываются в классе. Таким образом, класс — это описание того, какими свойствами и поведением будет обладать объект. А объект — это экземпляр с собственным состоянием этих свойств. Попробуем разобраться на примере class Car: def __init__(self, color, fuel, consumption): self.color = color self.fuel = fuel self.consumption = consumption self.odo = 0 def go(self, way): self.odo += way self.fuel -= self.consumption/100 * way def get_odo(self): return self.odo def get_fuel(self): return self.fuel Мы объявили класс Car, описали его свойства и методы. Свойства класса Car * ''color'' — цвет * ''fuel'' — количество топлива в баке * ''consumption'' — потребление топлива на 100км * ''odo'' — одометр (счетчик пробега в километрах) Методы класса Car * ''go(self, way)'' — ехать. Принимает в качестве параметра количество километров * ''get_odo(self)'' — получить текущий пробег * ''get_fuel(self)'' — получить текущее количество топлива в баке Сразу возникает вопрос, а что за метод __init__. Это //конструктор// — функция, вызываемая при создании объекта. Когда создается объект, то код этой функции исполняется. Наш конструктор автомобиля принимает сразу несколько параметров — цвет, количество топлива в баке и потребление топлива на 100км. При создании объекта автомобиля мы эти параметры указываем и конструктор создает объект с заданными параметрами. Также непонятно что такое self в параметрах всех функций и при обращении к свойствам. self — это ссылка объекта на самого себя, на текущий экземпляр класса. Ведь класс это всего лишь шаблон. И объектов, которые могут быть созданы по нему — много. Используя класс Car можно создать много экземпляров автомобилей со своими наборами свойств. Как видно мы описали абстрактно автомобиль. У любого автомобиля есть цвет, есть одометр, определенное потребление топлива и сколько-то топлива в баке. Теперь создадим два конкретных автомобиля — мой автомобиль и автомобиль брата: MyCar = Car('Black', 50, 10) BrotherCar = Car('White', 60, 15) Мы создали два объекта автомобиля ''MyCar'' и ''BrotherCar''. Это разные автомобили, разного цвета, в них разное количество топлива и даже потребляют они по-разному. Посмотрим сколько сейчас топлива в моем автомобиле и сколько он проехал print(MyCar.get_odo()) print(MyCar.get_fuel()) Результат: 0 50 Мой автомобиль еще ничего не проехал и топлива не потратил нисколько. Теперь проедем 20 километров и еще 10. MyCar.go(20) MyCar.go(10) И повторим запросы пробега и уровня топлива print(MyCar.get_odo()) print(MyCar.get_fuel()) Результат: 30 47.0 Действительно ''MyCar'' проехала 30 километров и за это время израсходовала 3 литра топлива. Теперь дадим проехаться машине ''BrotherCar'' BrotherCar.go(15) print(BrotherCar.get_odo()) print(BrotherCar.get_fuel()) Результат: 15 57.75 Мы рассмотрели основы объектно- ориентированного программирования. Поняли что такое класс и объект. Узнали как создать объект и как вызывать его методы. Но на самом деле объектно- ориентированное программирование на этом только начинается. [[https://habr.com/ru/post/463125/|Подробнее об ООП]]