Основы классов
Limera1n
Мы подошли к одному из самых интересных и серьезных разделов, который касается объектно ориентированного программирования. В общем ООП (объектно ориентированное программирование) позволяет создавать собственные классы, которые имеют методы и атрибуты. В мире есть множество классов объектов, например есть самолеты, разные. Вот например самолет можно сделать классом, у самолета есть множество атрибутов и характеристик, и возложенных на него функций. Есть класс машин. Поэтому мы в программе можем переложить реальный объект на абстрактный, на класс. В терминах языка программирования - назвать его car, отразить атрибуты, которыми обладает машина в реальной жизни и реализовать функции, которыми в реальной жизни обладает машина. Сделать это все только с помощью функций нельзя. Классы с методами один в один соответствуют тому, что мы имеем в реальном мире. Вот есть у нас в реальном мире собака, например, чтобы воспроизвести эту собаку в программном коде мы можем создать класс "собака", какие то атрибуты, типа ее цвет и так далее, и функции, типа гавкать. И вот использовав такой класс, мы можем породить кучу объектов этого типа, "собака 1", "собака 2", "собака 3". У этой собаки может быть атрибут "порода", например создать объект типа "собака", задать ей атрибут "такая то порода" , затем вызвать функцию "гавкать". Вот таким образом эти концепции соответствуют реальному миру. И все те типы, которые мы использовали до этого представлены классами, типа list например. Единственный момент, что те типы, которые мы использовали они еще более абстрактны, чем те, про которые мы сейчас говорили. list и другие типы, это все же типы данных, которые относятся непосредственно к программированию. В Python одних функций недостаточно, чтобы разрабатывать огромные программы, большие программы базируются на использовании не только методов, но и классов.

Попробуем создать свой класс. Для того, чтобы создать свой класс нужно воспользоваться ключевым словом class, а затем следует имя класса, и мы каждое слово пишем с заглавной буквы. pass значит, что мы не будем ничего реализовывать внутри класса. Исполняем этот код, и теперь мы можем создать экземпляр нашего класса. Смотрим, что за тип у нашей переменной, и видим, что ее тип соответствует имени класса.
У каждого класса есть конструктор. И класс может иметь один и более конструктор. Конструкторы используются для того, чтобы, грубо говоря, никто не смог создать экземпляр объекта в некорректном состоянии.
Например, представим, что Character нельзя создать без указания расы этого персонажа, для этого определяется конструктор. Он определяется вот так:

__init__ это специальное имя метода, записанное специальным образом, со специальным синтаксисом с двумя подчеркиваниями слева и справа, чтобы отличать специализированные методы от всех остальных. Метод имеет аргументы, первым аргументом указывается self, это ссылка на экземпляр, все атрибуты присущие объекту мы записываем через ссылку self. Вторым аргументом мы принимаем расу, а строкой ниже мы атрибуту на уровне объекта класса присваиваем значение из аргумента race. Теперь мы должны передать в переменную unit нашу расу. Мы можем вызвать атрибут character_race, который мы создали, и в этот character_race было записано то, что мы передали в качестве аргумента в конструктор, то есть "Elf".
Давайте добавим еще аргументы:

Теперь мы можем прописывать не только расу, но и переопределять значения для damage и armor.
Вот таким образом мы можем использовать классы и атрибуты. Пойдем дальше и разберемся с атрибутами и методами внутри класса.