И так народ, сегодня у нас на разборе очень сложная(самая сложная) и длинная тема. ООП - Объектно ориентированное программирование.
Основные понятия об ООП:
Что вообще такое ООП? Не буду вам читать определение с вики, вместо этого постараюсь объяснить простым языком.
ООП позволяет нам определить какие либо компоненты программы в виде классов. Класс это описание объекта. То есть например у нас есть класс персонаж, у него есть свои характеристики(свойства) - здоровье, атака, харизма и тд... А есть действия(методы) - атака, ходьба, прыжок и тд... И вот, чтобы нам каждый раз не писать новый код с новым персонажем(условно), мы просто пишем класс, вписываем все свойства и все, далее нам нужно просто вызвать этот класс и использовать его, это улучшает читаемость кода, это ускоряет написание кода, это используют все и не знать это нельзя. Другими словами класс это шаблон.
ООП в Python:
И так, как написать свой класс?
class <имя>:
Что же писать после двоеточия? Тут также как с функциями, но только после двоеточия мы пишем методы класса.
Звучит сложно, да?
Давайте напишем с вами простой класс, а позже научимся работать с ним.
Но чет не так, чет при запуске кода ничего не происходит. И, что это еще за аргумент self у функции? Что за self.name? self.age? Начнем по порядку. self нужно указывать, ибо это функция внутри класса, мы как бы говорим, что все переменные берутся из этого класса. А self.name и self.age это обращения к переменным name и age соответственно.
А как заставить это работать? Для этого нужно будет создать объект класса. Как?
<Имя переменной>=<имя класса>()
Теперь указанная нами переменная будет объектом указанного нами класса, давайте добавим это в наш код и создадим парочку людей)
Но и при запуске этого кода ничего не произойдет, как же нам все-таки работать с этим классом? Давайте попробуем изменить имя и возраст первого человека, после чего выведем имя и возраст обоих:
И так давайте разберем как мы обращаемся к переменным внутри класса и как используем функции из класса.
first_people.name - обращение к переменной name . Отсюда мы можем изменить ее значение, или получить ее для дальнейшей работы.
first_people.infopeople() - использование встроенной в класс функции в отношении его объекта(или другими словами использование метода функции).
Окей, мы научились создавать классы, но теперь настало время поговорить о конструкторах и деструкторах.
Что такое конструкторы? Согласитесь заполнять объект класса, как мы это делали выглядит не очень удобно, и хочется отказаться от ООП. Но давайте же научимся правильно заполнять данные. Вставлять пример кода, как я это обычно делаю через цитату, я тут не буду, ибо это не совсем удобно, поэтому продемонстрирую на написанном выше коде и все объясню.
Согласитесь, так выглядит удобнее, но что мы сделали? Мы добавили метод __init__ который отвечает за инициализацию данного класса, и теперь при создании объекта класса мы можем сразу указать имя и возраст человека и нам не нужно обращаться к переменным, далее все также.
С конструктором разобрались, а что делать с деструктором? Деструктор позволяет удалить объект класса, давайте покажу вам на примере того же кода, мне кажется так будет удобнее и мне и вам.
Что мы сделали? del first_people - удаление объекта. Прописанный нами метод __del__ - отвечает за выполнение кода после удаления объекта.
Ну, что же с этим тоже разобрались, перейдем к другой теме в ООП - инкапсуляция.
Инкапсуляция:
Вот, все это время мы делали, что-то с нашим классом, но мы даже не подумали, о том, что можно присвоить например отрицательный возраст, что нам не желательно, ибо такого не бывает, надо как-то подумать над контролем всего этого. И тут нашей волшебной палочкой является инкапсуляция , она позволяем нам создать контроль доступа, сделать переменную, которую нельзя изменить вне класса.
Давайте я просто отредактирую код и снова объясню, че это вообще было и нахер оно надо.
Я тут чутка конечно подредактировал, но суть прежняя.
И так вопросы:
1.Что за __age, __name ???
2.Почему мы возвращаем именно их в функции?
Хз, какие тут еще вопросы могут быть и так, вот и ответы:
1.Чтобы сделать переменную приватной для класса, то есть извне мы ее получить или изменить не сможем(если не пропишем это в функции) мы к ее названию добавляем __ . Соответственно приватную версию age , мы назвали __age , а приватную name - __name . Вот и все, все просто.
2.Ибо значения присваивались именно им.
Я понимаю в классах все выглядит очень запутанно, но это начинаешь полностью понимать, только работая с ними, сейчас еще немного расскажу на тему инкапсуляции и пожалуй на сегодня с нас ООП хватит, там останется две темы. Ну ладно, хватит лирического отступления.
Свойство благодаря которому мы получаем значения приватных переменных из вне называется геттер или аксессор .
Свойство позволяющее переопределить значение приватной переменной из вне называется сеттер или мьютейтор .
Ну, что же на сегодня с ООП все, в следующем занятии мы еще немного разберем ООП, потом файлы, дата и время, некоторые модули. А на сегодня все.