Найти тему
postHack

Основы Python #9. ООП в Python.

Оглавление

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

Основные понятия об ООП:

Что вообще такое ООП? Не буду вам читать определение с вики, вместо этого постараюсь объяснить простым языком.

ООП позволяет нам определить какие либо компоненты программы в виде классов. Класс это описание объекта. То есть например у нас есть класс персонаж, у него есть свои характеристики(свойства) - здоровье, атака, харизма и тд... А есть действия(методы) - атака, ходьба, прыжок и тд... И вот, чтобы нам каждый раз не писать новый код с новым персонажем(условно), мы просто пишем класс, вписываем все свойства и все, далее нам нужно просто вызвать этот класс и использовать его, это улучшает читаемость кода, это ускоряет написание кода, это используют все и не знать это нельзя. Другими словами класс это шаблон.

ООП в Python:

И так, как написать свой класс?

class <имя>:

Что же писать после двоеточия? Тут также как с функциями, но только после двоеточия мы пишем методы класса.

Звучит сложно, да?

Давайте напишем с вами простой класс, а позже научимся работать с ним.

Класс хранящий имя и возраст человека.
Класс хранящий имя и возраст человека.

Но чет не так, чет при запуске кода ничего не происходит. И, что это еще за аргумент self у функции? Что за self.name? self.age? Начнем по порядку. self нужно указывать, ибо это функция внутри класса, мы как бы говорим, что все переменные берутся из этого класса. А self.name и self.age это обращения к переменным name и age соответственно.

А как заставить это работать? Для этого нужно будет создать объект класса. Как?

<Имя переменной>=<имя класса>()

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

Класс people и его объекты.
Класс people и его объекты.

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

Изменение и вывод информации о человеке.
Изменение и вывод информации о человеке.
Результат работы.
Результат работы.

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

first_people.name - обращение к переменной name . Отсюда мы можем изменить ее значение, или получить ее для дальнейшей работы.

first_people.infopeople() - использование встроенной в класс функции в отношении его объекта(или другими словами использование метода функции).

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

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

Код 2.0.
Код 2.0.
Результат работы.
Результат работы.

Согласитесь, так выглядит удобнее, но что мы сделали? Мы добавили метод __init__ который отвечает за инициализацию данного класса, и теперь при создании объекта класса мы можем сразу указать имя и возраст человека и нам не нужно обращаться к переменным, далее все также.

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

Пример этого кода с удалением объекта.
Пример этого кода с удалением объекта.
Результат выполнения данного кода.
Результат выполнения данного кода.

Что мы сделали? del first_people - удаление объекта. Прописанный нами метод __del__ - отвечает за выполнение кода после удаления объекта.

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

Инкапсуляция:

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

Давайте я просто отредактирую код и снова объясню, че это вообще было и нахер оно надо.

Отредактированная версия кода.
Отредактированная версия кода.
Результат выполнения.
Результат выполнения.

Я тут чутка конечно подредактировал, но суть прежняя.

И так вопросы:

1.Что за __age, __name ???

2.Почему мы возвращаем именно их в функции?

Хз, какие тут еще вопросы могут быть и так, вот и ответы:

1.Чтобы сделать переменную приватной для класса, то есть извне мы ее получить или изменить не сможем(если не пропишем это в функции) мы к ее названию добавляем __ . Соответственно приватную версию age , мы назвали __age , а приватную name - __name . Вот и все, все просто.

2.Ибо значения присваивались именно им.

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

Свойство благодаря которому мы получаем значения приватных переменных из вне называется геттер или аксессор .

Свойство позволяющее переопределить значение приватной переменной из вне называется сеттер или мьютейтор .

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

@postHack

Дзен