Атрибуты и методы
Limera1n
Продолжим тему атрибутов, классов и методов.
Создадим некоего персонажа, как мы делали в прошлом посте, но поговорим обо всем в процессе написания:

Вот эти выделенные атрибуты уровня инстанции, то есть этими атрибутами клиентский код сможет пользоваться только после создания экземпляра типа Character. Чтобы определить атрибуты уровня класса, а не уровня инстанции класса можем прописать атрибуты прям под class Character():, например:

Это значит следующее - теперь max_speed мы можем вызвать не создавая экземпляр типа Character используя такой синтаксис: unit = Character('Human'), происходит это вот так:

А вот те атрибуты, которые были созданы с помощью ключевого слова self к ним мы так обратиться не можем. Если мы все же попробуем так сделать, то будет ошибка AttributeError:

Для того, чтобы воспользоваться атрибутом уровня инстанции, нам сначала нужно создать такую инстанцию. Например:

В класс можно добавить операцию. Прежде чем добавить парочку операций, добавим еще один атрибут и приступим к операциям, ну или методам:

Теперь попробуем вызвать методы:

Нанесли нашему персонажу 20 урона и вывели его уровень здоровья. Запросили, мертв ли персонаж, в ответе False, потому что у него еще 80 здоровья. Нанесли 80 урона и запросили снова, мертв ли персонаж, ответ True, так как его здоровье стало равно 0.
Важным моментом является то, что так называемых приватных атрибутов не существует в Python. То есть, если у нас есть атрибут unit.health, и мы можем его модифицировать не через метод hit, а напрямую и это будет работать:

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