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

Мы разделим этот урок на 2 части, в первой мы рассмотрим, что такое ООП в теоретическом плане, а затем в практическом.

Начнем с самого начала: что означает ООП? Это означает объектно-ориентированное программирование. Теоретически ООП — это метод программирования, созданный для противодействия спагетти-коду. Например, если вы моделируете популяцию без ООП, вы создаете массив с именем Population, а внутри этого массива и другой массив в качестве первого элемент имя, затем фамилия, затем возраст и т. д. … . В ООП вы создадите массив с именем Population, и в этом массиве будут объекты с именем Persons, и этот объект Persons будет содержать все свойства людей. Другой большой частью ООП является наследование, это означает возможность создавать и возражать с теми же свойствами другого объекта, а затем добавлять к нему другой элемент. В нашем примере мы можем захотеть создать объект Child, который наследует свойства объекта Persons и имеет другие свойства, такие как любимые игрушки.

В большинстве языков программирования ООП реализуется довольно похожим образом: вы определяете свой «класс» или «структуру», который является объектом, затем имя объекта, например Persons. Затем внутри вы сможете создавать экземпляры общедоступных и частных переменных, которые будут доступны или нет вне вашего объекта. Мы рекомендуем сделать все ваши переменные закрытыми и использовать методы для доступа к ним. Существует 3 типа методов: геттеры, сеттеры и другие типы.

Тип геттера используется для получения данных нашего объекта. Мы создаем собственный метод, чтобы наши переменные повышали безопасность (например, проверяли, есть ли у пользователя доступ к этим данным) и изменяли данные, чтобы они были понятны человеку.

Как вы уже догадались, тип установки позволяет установить данные нашего объекта. И, как и в случае с геттером, мы создаем пользовательский метод для повышения безопасности, и мы можем захотеть проверить, является ли тип данных правильным (например, переменная, содержащая имя, не может быть числом).

Другой тип находится между ними. Например, если у нас есть объект, который представляет человека, мы можем создать метод, который будет определять, понравится ли человеку объект или нет, этот метод не будет устанавливать никаких данных. strong> и будет получать любые данные, он будет создавать данные в зависимости от состояния объекта

Теперь самое интересное. Идем кодить, наконец!!!

В качестве примера мы собираемся создать объект собаки.

Мы собираемся создать объект с ключевым словом «класс», а затем по соглашению назовем класс собаки заглавной буквой:

Теперь мы собираемся создать метод __init__, который будет вызываться при инициализации объекта:

В python нет такой вещи, как закрытые переменные, но соглашение заключается в том, что другой разработчик не будет пытаться вызывать переменную с символом подчеркивания впереди, поскольку это подразумевает, что переменная должна быть вызвана геттером или это внутреннее состояние, о котором никто не должен беспокоиться

Теперь мы собираемся закодировать методы getters:

а теперь методы setters:

В сеттере мы помещаем множество условий, чтобы убедиться, что записанное значение имеет правильный тип. Но теперь у нас есть проблема, методы __init__ не имеют этой функции безопасности, поэтому мы собираемся использовать сеттеры, которые мы определили в __init__. Просто так :

Теперь об этой безопасности позаботились. Мы также можем захотеть показать человеческий возраст нашей собаки, который в семь раз превышает реальный возраст. И мы можем также захотеть установить человеческий возраст, но так как мы храним реальный возраст, нам нужно разделить заданный возраст на семь, вот так:

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

Как вы видели, мы храним породу в массиве, поэтому, например, акита-ину и шетландская порода хорошо сочетаются в переменной породы «Акита-ину» и «Шетландская».

Итак, для метода, который возвращает true, если собака чистой породы, нам нужно проверить, равно ли количество пород в массиве единице. Просто так:

И теперь, чтобы закончить создание объекта, мы добавим функцию печати. Мы хотим, чтобы наш объект мог быть представлен в виде строки, для этого мы добавляем метод __str__, который будет вызываться для преобразования нашего объекта в строку. И это выглядит так:

Теперь пришло время использовать этот объект.

Чтобы создать переменную с использованием объекта, мы просто называем объект его именем. В нашем случае объект называется Dog. В python мы затем помещаем круглые скобки только в том случае, если вызываем функцию, а затем помещаем переменную, которую мы добавили в метод __init__. В нашем случае параметром будет имя, возраст, порода и окрас. Мы используем это так:

Если мы хотим напечатать наш объект, мы просто делаем это:

и это покажет, что:

Фидо - 3-летний черный лабрадор.

и мы можем изменить возраст нашей собаки, а затем повторно напечатать объект:

Выход :

Фидо - 3-летний черный лабрадор.
Фидо - 5-летний черный лабрадор.

Код собаки:

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

Мы собираемся создать новый файл и создать объект с именем Животные, который будет иметь 2 свойства: возраст и диету:

Теперь давайте создадим объект с именем TamedAnimal, который унаследует свойства объекта Animal и будет иметь имя и имя владельца.

Мы используем ключевое слово super() для получения унаследованного класса. Как только мы создадим геттеры, сеттеры и методы __str__, объект TamedAnimal будет выглядеть так:

Теперь давайте использовать его:

Этот вывод кода:

Бобби 2 года, он ест мясо, и это прирученное животное Джона
Бобби сменил владельца на Майкла
Бобби сейчас 3 года
Бобби 3 года, он ест мясо, и это прирученное животное Майкла

И это в значительной степени все, что я не охватил всю сложность объекта, но просто знание этого урока должно помочь вам начать работу в мире ООП.

Если вы хотите попробовать это сами, но не знаете, что делать, попробуйте создать объект Animal (с возрастом и диетой), затем объект TamedAnimal (с именем и именем владельца), который наследует Animal, а затем Объект Dog (с расой и цветом), чем наследуется от TamedAnimal

И если вы хотите больше, попробуйте написать функцию с именем спаривание, которая вернет потомка двух собак.

Если вам понравилось читать мою статью, рассмотрите возможность подписаться на меня на Medium, чтобы увидеть больше моих работ.