Давайте усложним немножко наши примеры и добавим классам методы.
Методы это по большому счёту просто функции, которые действуют
в контексте экземпляра класса.
Таким образом так как они действует в контексте экземпляра и
получают ссылку на экземпляр класса, они могут менять его состояние,
обращаясь к атрибутам экземпляра или делать любую полезную
работу, которая нам захочется.
Давайте посмотрим, как создать метод экземпляра и вызвать его.
население
планеты нестабильно, люди рождаются и умирают
поэтому мы создали класс human, у которого есть два атрибута name и age,
имя и возраст
и также у нас есть класс планеты, у которой есть атрибут name
и также атрибут population, который является списком и этот
список будет содержать людей, которые есть на планете.
Вот
здесь мы объявили метод add human, который
является методом экземпляра
и по большому счёту это просто функция, функция, которая принимает
первым аргументом self, это ссылка на экземпляр класса,
а вторым аргументом всё что мы захотим. И так как это обычная функция,
она может принимать сколько угодно аргументов
как позиционных, так и именованных.
В данном случае она принимает один.
Это будет экземпляр класса Human.
Внутри этого метода мы печатаем на экран приветственное сообщение
новому человеку и обновляем атрибут экземпляра population.
Добавляем туда нового человека.
Также внутри методов, так как это просто функция в контексте экземпляра,
мы можем использовать
конструкцию return, чтобы возвращать из них какие-то значения,
но в данном случае нам это не потребовалось.
Давайте посмотрим как этим пользоваться,
мы создаем экземпляр класса Planet, Mars, дальше мы создаем
экземпляр класса Human, даем человеку имя Боб и затем мы
у экземпляра
класса Planet Mars вызываем метод add_human
и передаем в него аргумент,
объект нашего человека.
Таким образом, мы обновляем население планеты и если мы посмотрим
на то что выглядит mars.population, мы видим что действительно
население планеты обновилось. Kак раз то, что мы делали внутри
метода экземпляра add_human.
Ничто не мешает нам из методов вызывать другие методы.
Давайте посмотрим еще на один пример
и убедимся в том, что это действительно возможно,
и как это сделать.
Мы объявляем класс Human, у которого программист предположим решил
сделать атрибут name и age
вот такими, то есть назвать их, начиная с символа нижнего подчёркивания.
Также у этого класса метод экземпляра say,
который также начинается с нижнего подчёркивания,
а ещё два метода say_name и say_нow_old,
которые печатают, сколько человеку лет и какое у него имя.
Что значат эти символы нижнего подчёркивания?
В других языках программирования вы могли встречаться с
protected, рrivate атрибутами то есть механизмами защиты атрибутов,
которые определены внутри класса.
В Python-e такого механизма нет и по большому счёту вы можете
достучаться до любого атрибута,
однако есть такое соглашение, что если атрибут либо метод
названы c символа нижнего подчёркивания, то ими пользоваться
не рекомендуется потому, что в дальнейших версиях
той или иной библиотеки программист, который пишет
может либо отказаться от этих атрибутов или методов, начинающихся
с символа нижнего подчеркивания, либо поменять их поведение
каким-то образом.
Однако у нас есть класс, у которого есть два публичных метода,
say_name и say_how_old, оба эти методы вызывают
приватный метод say.
Посмотрим как этим пользоваться. Мы объявляем
переменным Боб, который является экземпляром класса Human
и дальше мы можем вызывать методы,
которые внутри себя будут вызывать другой метод,
и мы видим что печатается то, что мы хотим.
А вот так вот обращаться к атрибуту экземпляра и методу
экземпляра не рекомендуется
как раз потому что эти
атрибуты и метод начинаются с символа нижнего подчёркивания.
Несмотря на то, что Python предоставляет эту возможность.
Другой концепт, который есть
в реализации классов на Python, это так называемый метод класса
либо classmethod.
Зачем это может быть нужно? Так может получиться, что
вам нужно объявить метод, но
этот метод не привязан к конкретному экземпляру,
но в тоже время он вовлекает класс в свою работу тем или иным образом,
сам класс, то есть сам класс,
которым вы оперируете, лучше всего посмотреть на примере.
Давайте отвлечемся немножко от планет и людей и
посмотрим класс Event, класс, который описывает события.
У этого класса есть описание и дата, когда это событие происходит,
также я переопределил метод str, чтобы когда мы печатали event
на экран выводилось что-то осмысленное.
Посмотрим как им пользоваться.
Мы получаем
текущую дату
используя модуль datetime стандартной библиотеки Python,
и дальше как обычно создаем экземпляр класса Event,
инициализируя его с помощью описания и даты.