Классы в Python простым языком. Часть 1

Классы в Python. Адовая тема, которую я все еще пытаюсь понять, и простым описанием которой попробую поделиться…

В Python все является объектами. А это значит, что каждый объект имеет метод и значение. Попробуем представить это в виде драки 🙂 Имеются два бойца, каждый из которых имеет силу удара, определяемую случайным значением + общие значения: уровень здоровья и уровень, при достижении которого боец проиграл (нулевое значение). Создаем класс (объект):
class Fighter() — все, класс создан. Важно: название класса указывается с большой буквы. Теперь добавим этому классу (объекту) нужные атрибуты (параметры). В нашем случае это максимальный и минимальный уровень здоровья:
health = 100
dead_level = 0

Все 🙂 У нас имеется некий объект, который имеет 100 единиц жизни, и нуль как минимальное значение. Теперь, учитывая, что объектов (классов) — у нас два (бойцов-то двое), и каждый из них наносит удар с какой-то определенной силой — создадим эти классы (объекты):
class F1(Fighter) — как видно, мы создали класс F1, который является независимым, но в качестве родительского использует класс Fighter (максимальный и минимальный уровень здоровья). Аналогично поступим со вторым бойцом:
class F2(Fighter) — создали бойца, и теперь каждому из них добавим атрибут нанесения удара:
kick_level = random.randrange(1, 15)

Для большего интереса представим ситуацию: два бойца (каждый из которых, напомню, является объектом) наносят удары друг другу поочередно. Сила удара колеблется от единицы до пятнадцати. Кто достиг отметки в нуль единиц жизни первый — проиграл.

В полном виде код выглядит так:

  1. import random #Подключаем библиотеку, отвечающую за генерацию случайных значений
  2. rounds = 1 #Создаем переменную, которая считает раунды
  3.  
  4. class Fighter(): #Создаем класс "Боец", который имеет общие для обоих бойцов атрибуты (характеристики)
  5.     health = 100 #Максимальный уровень жизни
  6.     dead_level = 0 #Минимальный уровень жизни
  7.  
  8. class F1(Fighter): #Создаем класс "Боец 1", который наследует атрибуты класса "Боец" (родительский класс указан в скобке)
  9.     kick_level = random.randrange(1, 15) #Генерируем силу удара бойца
  10.  
  11. class F2(Fighter): #Создаем класс "Боец 2", которые наследует атрибуты класса "Боец" (родительский класс указан в скобке)
  12.     kick_level = random.randrange(1, 15) #Генерируем силу удара бойца
  13.  
  14. f1 = F1() #Создаем переменную, которая содержит класс "Боец 1"
  15. f2 = F2() #Создаем переменную, которая содержит класс "Боец 2"
  16.  
  17. print('Изначально:\nБоец 1 имеет здоровья:', Fighter.health, '\nБоец 2 имеет здоровья:', Fighter.health) #Выводим начальное значение уровня здоровья бойцов - для этого используем значение health из класса Fighter
  18. while f1.dead_level <= f1.health or f2.dead_level <= f2.health: #Создаем цикл, который будет работать пока значение здоровья первого или второго бойца не достигнут минимального значения здоровья (dead.level) класса Fighter
  19.     print('\nРаунд:', rounds)
  20.     print('Боец 1:', f2.health, 'жизни\nБоец 2:', f2.health, 'жизни')
  21.     print('Боец 1 бьет Бойца 2 с силой:', f1.kick_level) #Переменная f1(класс F1) бьет с силой, которая генерируется атрибутом силы удара (kick_level)
  22.     f2.health = f2.health - f1.kick_level #Перезаписываем значение уровня здоровья в классе "Боец 1 (F1)"
  23.     print('После удара у Бойца 2 осталось здоровья:', f2.health) #Выводим текущее значение уровня здоровья
  24.     if f2.health <= 0: #Делаем проверку на соответствие значению окончания боя
  25.         break #Если проверка ОК - выходим из цикла
  26.  
  27.     print('Боец 2 бьет Бойца 1 с силой:', f2.kick_level) #Переменная f1(класс F1) бьет с силой, которая генерируется атрибутом силы удара (kick_level)
  28.     f1.health = f1.health - f2.kick_level #Перезаписываем значение уровня здоровья в классе "Боец 2 (F2)"
  29.     print('После удара у Бойца 1 осталось здоровья:', f1.health) #Выводим текущее значение уровня здоровья
  30.     if f1.health <= 0: #Делаем проверку на соответствие значению окончания боя
  31.         break #Если проверка ОК - выходим из цикла
  32.     rounds = rounds + 1 #Увеличиваем номер раунда на единицу
  33.  
  34. if f1.health > f2.health: #Определяем, какое сообщение выводить в случае победы того или иного бойца
  35.     print('Победил Боец 1')
  36. else:
  37.     print('Победил Боец 2')

Код так же доступен на Git, если что 🙂

Собственно — это самое минимальное описание классов в Python на сегодня. Хотите продолжения (передача значений, вызов родительского класса и прочее) — следите за обновлениями. Обещаю продолжить эту тему в самое ближайшее время.

Немного скорректированный код (указал один из читателей на факт того, что выдавалось неверное здоровье для каждого из бойцов):

'''
1. Создаем класс "Боец" с атрибутами: уровень жизни максимальный, уровень жизни минимальный
2. Создаем два других класса - боец 1 и боец 2, у каждого их которых имеются атрибут силы удара (генерируется рандомом)
3. Бойцы деруться между собой, нанося друг другу урон
4. Кто первый достигнул нулевого уровня жизни - проиграл
'''
import random
rounds = 1
 
class Fighter():
    health = 100
    dead_level = 0
 
class F1(Fighter):
    kick_level = random.randrange(1, 15)
 
class F2(Fighter):
    kick_level = random.randrange(1, 15)
 
f1 = F1()
f2 = F2()
 
print('Изначально:\nБоец 1 имеет здоровья:', Fighter.health, '\nБоец 2 имеет здоровья:', Fighter.health)
while f1.dead_level <= f1.health or f2.dead_level <= f2.health:
    print('\nРаунд:', rounds)
    print('Боец 1:', f1.health, 'жизни\nБоец 2:', f2.health, 'жизни')
    print('Боец 1 бьет Бойца 2 с силой:', f1.kick_level)
    f2.health = f2.health - f1.kick_level
    print('После удара у Бойца 2 осталось здоровья:', f2.health)
    if f2.health <= 0:
        break
 
    print('Боец 2 бьет Бойца 1 с силой:', f2.kick_level)
    f1.health = f1.health - f2.kick_level
    print('После удара у Бойца 1 осталось здоровья:', f1.health)
    if f1.health <= 0:
        break
    rounds = rounds + 1
 
if f1.health > f2.health:
    print('Победил Боец 1')
else:
    print('Победил Боец 2')

И да — в случае возникновения вопросов — пишите на почту или в Telegram.