Введение
Парадигма объектно-ориентированного программирования (ООП) в наше время используется повсеместно. Чем она так хороша? При использовании объектно-ориентированного подхода в процессе написания кода, разработчик выстраивает логику так, чтобы оперировать объектами. Почему именно объекты? Объект наиболее удобен для восприятия, так как похож на элемент привычной нам реальной жизни. У каждого объекта есть свои параметры, свойства, особенности, отличные и одинаковые черты при сравнении их с другими объектами. Каждый объект в некотором роде уникален, но при этом множество объектов имеют схожие черты с другими объектами. Значит, существуют параметры, атрибуты, свойства которые идентичны для определённого набора объектов. Так появилось понятие класса.
Класс — это набор данных и методов по работе с ними. Так звучит самое корректное и общепринятое определение. Если по-простому, то класс — это «что-то с чем-то» или «коктейль». Коктейль состоит из ингредиентов. Определённые объёмы коктейля можно использовать для создания других коктейлей. И так далее… вариантов интерпретации понятия «класс» — тьма. В итоге класс является типом данных. Новый класс — новый тип.
Объект — это единица чего-либо, которую можно рассматривать как самостоятельный и достаточный компонент. Звучит сложно, но на деле проще показать. Возьмём заезженный пример — автомобиль.
На автомобиле можно ездить. Когда говорим «автомобиль» кому-то, то собеседник сразу поймёт о чём идёт речь (если, конечно, он не гость из далёкого прошлого) и нет необходимости объяснять, что автомобиль — это набор гаек, заклёпок, шестерёнок собранных строго по конкретной схеме в различные запчасти, которые потом присоединялись к другим запчастям вообще никак не похожим друг на друга, а получившиеся конструкции красиво и элегантно покрывались различными полимерами. Автомобиль — это автомобиль. Это может быть и трактор, и гоночный болид, и Chevrolet Camaro зелёного цвета (на изображении — он).
Метод — это некий однозначный способ обработки данных.
Аналогия
Для наиболее полного понимания используем аналогию. Класс — это автомобиль. Объект — это трактор или гоночный болид или Chevrolet Camaro. Каждый трактор — автомобиль, но не каждый автомобиль — трактор. Согласитесь, автомобиль на изображении выше совсем не похож на трактор, но при этом они оба являются автомобилями.
Что объединяет два этих автомобиля? Они оба могут ехать вперёд и назад, поворачивать направо и налево, иметь сидение для водителя, бибикать. Есть сходства — есть и различия. В тракторе одно сиденье, а в Camaro два. У трактора большие колёса, а у Camaro среднего размера. У трактора передние и задние колёса разные по размеру, у Camaro все четыре колеса одинаковые по размеру. Один класс может служить основой для другого класса.
Создание своего класса
Для создания своего класса в Python используется конструкция, началом которой является служебное слово class. Сначала прописывается служебное слово, затем имя класса. В Python классы принято именовать словами с заглавной буквы разделёнными между собой символом нижнего подчёркивания.
Создадим класс делает ровным счётом ничего
1 2 |
class My_class: pass |
Так объявляется класс.
Добавим в наш класс несколько полей и методов, которые будут взаимодействовать с этими данными и один метод, который будет как Дядя Фёдор из великого мультфильма — сам по себе.
Поле класса — это переменная, которая создаётся с инициализацией класса.
Метод класса — это функция в контексте ООП.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class My_class: # ПОЛЯ left_value = None right_value = None # МЕТОДЫ # запись значения в поле def set_left_value(self, number): if isinstance(number, int): self.left_value = number # запись значения в поле def set_right_value(self, number): if isinstance(number, int): self.right_value = number # получение значения содержащегося в поле def get_left_value(self, number): return self.left_value # получение значения содержащегося в поле def get_right_value(self, number): return self.right_value # метод суммирования двух чисел def count(self, first, second): try: result = first + second except ValueError as ex: return ex return result |
Значения полей заданы как None, это значит, что там ничего нет. Согласно философии Python все переменные должны быть объявлены, поэтому, чтобы не присваивать числовое значение по умолчанию мы присвоим «пустоту».
Сеттеры и геттеры
Названия методов, которые записывают значение в поле и берут значение поля, начинаются с set и get. Это так называемые сеттеры и геттеры. Это общепринятые термины, которые используются для однозначного описания конкретных процессов. Если записываем, то используем сеттер (set), если берём, то используем геттер (get). На одно поле используется один сеттер и один геттер. Но не обязательно использовать их оба, если поле является константой, то сеттер попросту не требуется.
Есть возможность обратиться к полю по его имени через точку, но такой подход является небезопасным. Изменение может произойти в любой момент времени и контролировать данный процесс возможно только через реализацию геттеров и сеттеров для каждого поля класса, где это необходимо. Не стоит писать их, если они не требуются.
В каких случаях создание сеттеров и/или геттеров не нужно?
- если в поле хранится неизменяемое значение (константа)
- если поле используется внутренними механизмами класса
Вызов методов класса
Для вызова методов класса необходимо:
- создать объект класса «My_class»
- через точку обращаться к методам класса
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def main(): instance = My_class() instance.set_left_value('3') instance.set_right_value(3) print(instance.right_value) print(instance.left_value) print(instance.count(43, 2)) if __name__ == "__main__": main() |
В консоле получим
1 2 3 |
3 None 45 |
- Значение 3 является значением поля right_value
- Значение None является значением поля left_value, значение None было присвоено изначально и оно не изменилось из-за того…
- … что мы передали символ тройки, а не число
- … в сеттере есть валидация (проверка) на принадлежность к числовому типу
- Значение 45 является результатом сложения 43 и 2
Вот так вот просто можно создавать классы и их поля с методами.