Классы и объекты в Python

Python – это объектно-ориентированный язык программирования. И для него характерны все особенности, которые есть у этого типа. Следовательно, в нем есть такие понятия, как классы и объекты. Перед тем, как разберем особенности работы с классами, необходимо вообще разобраться в том, что такое объектно-ориентированные языки, в чем их преимущества и почему Python относится к этой категории.

Понятие объектно-ориентированных языков программирования

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

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

Очень просто изобразить смысл объектно-ориентированного языка на реальном примере. Например, есть объект «машина». Она может иметь такие свойства:

  1. Цвет. Например, машина красного оттенка.
  2. Вес. Допустим, 1 тонна.
  3. Стоимость. Миллион долларов. 

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

  1. Ехать. 
  2. Потреблять топливо.
  3. Сигналить.
  4. Воспроизводить музыку через аудиоустройство.
  5. Современные модели имеют собственный планшет, который показывает дорогу.

Функций может быть очень много. Такой подход очень наглядно объясняет принцип объектно-ориентированного программирования. Вся предметная область разбивается на объекты, которые являются независимыми. Все происходит благодаря тому, что соблюдаются три ключевых принципа объектно-ориентированного программирования.

  1. Инкапсуляция. Объект может скрывать поведение. То есть, водитель едет в машине, но не знает, что в ней происходит. Он просто пользуется ею. Это – один из главных принципов объектно-ориентированного программирования.
  2. Наследование. Продолжаем пример машины. Предположим, у нас есть два объекта: водитель и человек. У них есть много общих признаков. Но один из объектов является более общим – человек. В свою очередь, водитель – это разновидность человека, но имеющая определенные свойства и поведение, характерное исключительно для него. Например, свойством водителя являются водительские права, а человек может и не иметь их.
  3. Полиморфизм. Это переопределение поведения. Для примера приведем три объекта – знакомых нам водителя и человека и одного нового – пешехода. Человек может передвигаться. Но характер того, как он движется, зависит от того, он водитель или пешеход. То есть, поведение у них схоже – они перемещаются. Но один использует собственную мускульную силу для этого, а другой – автомобиль.

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

На данный момент, почти все современные языки являются объектно-ориентированными. Хотя бы потому, что так значительно проще программировать. Равно, как и обучиться разработке приложений.

Что такое класс

А теперь давайте рассмотрим то, что такое класс и как он соотносится с объектом. Представим, есть человек. Каждый из нас имеет определенный набор свойств, которые выделяют нас на фоне остальных. Например, имя. Когда мы говорим про знакомого с именем Андрей, то сразу понимаем, о ком идет речь. 

Все люди имеют набор общих свойств. Например, имя, фамилия, возраст. Если обобщить всех людей, которые имеют одинаковый набор свойств и поведение, то это и будет классом. 

Давайте для примера возьмем компанию. В ней есть сотрудники. Каждый из них работает в определенном департаменте, имеет определенную должность, зарплату. Эти характеристики, как правило, определяются в тот момент, когда появляется новый сотрудник в компании. У этого человека можно спросить о том, какие у него навыки или попросить его помочь другому человеку. И все сотрудники могут сделать точно так же.

Зарплату знает только сам сотрудник, руководитель и бухгалтер. Другие же – не знают (в большинстве случаев). Вот это – реальный пример инкапсуляции в жизни. 

На уровне класса определяется набор свойств и поведения. Например, руководитель – это сотрудник. У него есть все характеристики, свойственные для этого класса. Тем не менее, у него есть ряд уникальных характеристик, которые выделяют его на фоне остальных объектов. Например, таким свойством может быть наличие людей, которые его слушаются.

Здесь мы видим пример наследования. Руководитель, как объект класса «сотрудники» наследовал свойства сотрудников (имеет должность, определенный уровень зарплаты и т.д). Между всеми объектами есть отношения. В нашем случае это – отношение «является». То есть, руководитель – это сотрудник, но не каждый сотрудник – это руководитель. 

У класса может быть больше одного наследника. Это явление называется иерархией. В нашем случае, те классы, которые являются родственными, не связаны этим отношением в иерархии между собой. Так, бухгалтер – это сотрудник, но не руководитель. 

Эти правила дают возможность проверить, насколько корректной является иерархия. Если взять документ, в котором перечислены все работники предприятия, то в ней будут и руководители, и бухгалтеры, но отображаться они будут точно так же. А вот если нам надо узнать, какие подчиненные у каждого из руководителей, то нам необходимо воспользоваться отдельной ведомостью, в которой есть свойства, характерные для руководителей. Это – явный пример полиморфизма. 

Таким образом, класс – это самая общая категория в объектно-ориентированном программировании. В нем содержатся все свойства и методы объекта (действия, поведение, которое мы описали ранее).

Преимущества 

Объектно-ориентированное программирование имеет ряд преимуществ и недостатков:

  1. С помощью классов можно конструировать программу в прямом смысле этого слова. Достаточно просто понимать, как они работают, какие у них свойства и каким образом они взаимодействуют между собой.
  2. Данные и операции образуют единую субстанцию и не «размазываются» по программе, как это часто случается в случае с процедурным программированием.
  3. Код выглядит более наглядным, и его может прочитать даже тот программист, который над ним непосредственно не работал, и понимать, что будет делать эта программа.
  4. С помощью инкапсуляции появляется возможность защитить приложение от нежелательного доступа. 

Благодаря объектно-ориентированному программированию появляется возможность создавать расширяемые системы. То есть, в программу можно добавить дополнительные компоненты без необходимости переписывать уже существующие. В этом вы убедитесь, когда будете изучать различные фреймворки для Python. Но не ими одними ограничивается ООП. 

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

Кроме этого, такие компоненты не содержат ошибок, поскольку они отлажены огромное количество раз. Также объектно-ориентированное программирование позволяет создавать интуитивно-понятные приложения, не требующие дополнительного обучения.

А теперь перейдем непосредственно с особенностями объектно-ориентированного программирования в Python.

Как создавать класс в Python?

Для этого используется ключевое слово class. Давайте сгенерируем класс, называющийся MyClass, имеющий свойство x.

class MyClass:

    x = 5

Видим, что свойства задаются так же, как переменные. По сути, они ими и являются.

Создание объекта

Теперь давайте создадим объект, относящийся к классу. Делается это следующим образом.

p1 = MyClass()

print(p1.x)

Функция init

__init__ – это встроенная функция, которая есть у каждого класса. Она вызывается каждый раз при создании объекта. Она используется для того, чтобы определять свойства объектов во время их создания.

Давайте попробуем создать класс с именем Person. Для этого используем функцию __init__(), чтобы добавить имя и возраст. 

class Person:

    def __init__(self, name, age):

        self.name = name

        self.age = age




p1 = Person("Василий",  36)    

print(p1.name)  

print(p1.age)

Учитывайте то, что вызов этой функции происходит каждый раз, когда создается новый объект.

Что такое метод объекта

Метод – это как раз то действие, которое выполняет объект. Каждый объект имеет какие-то методы. Технически это такая же функция, просто которая вызывается из объекта, ассоциируется с ним.

Давайте попробуем создать такой метод. 

class Person:

    def __init__(self, name, age):

        self.name = name

        self.age = age

    

    def  myfunc(self):

        print("Привет, меня зовут "  + self.name)

        

p1 = Person("Василий", 36)

p1.myfunc()

Параметр self

Этот параметр – ссылка на сам класс. Он применяется с целью получить доступ к переменным, ассоциированных с ним. Он необязательно называется так. но он должен быть первым. 

class Person:

    def __init__(mysillyobject, name, age):

        mysillyobject.name = name

        mysillyobject.age = age

    

    def myfunc(abc):

        print("Привет, меня зовут "  + abc.name)




p1 = Person("Василий", 36)

p1.myfunc()

Удаление объекта

Наконец, чтобы удалить объект, необходимо использовать ключевое слово del.

del p1

С помощью этого ключевого слова возможно удаление также и отдельных свойств.

del p1.age

ОфисГуру
Adblock
detector