Классы в Python. Адовая тема, которую я все еще пытаюсь понять, и простым описанием которой попробую поделиться…
В Python все является объектами. А это значит, что каждый объект имеет метод и значение. Попробуем представить это в виде драки 🙂 Имеются два бойца, каждый из которых имеет силу удара, определяемую случайным значением + общие значения: уровень здоровья и уровень, при достижении которого боец проиграл (нулевое значение). Создаем класс (объект):
class Fighter() — все, класс создан. Важно: название класса указывается с большой буквы. Теперь добавим этому классу (объекту) нужные атрибуты (параметры). В нашем случае это максимальный и минимальный уровень здоровья:
health = 100
dead_level = 0
Все 🙂 У нас имеется некий объект, который имеет 100 единиц жизни, и нуль как минимальное значение. Теперь, учитывая, что объектов (классов) — у нас два (бойцов-то двое), и каждый из них наносит удар с какой-то определенной силой — создадим эти классы (объекты):
class F1(Fighter) — как видно, мы создали класс F1, который является независимым, но в качестве родительского использует класс Fighter (максимальный и минимальный уровень здоровья). Аналогично поступим со вторым бойцом:
class F2(Fighter) — создали бойца, и теперь каждому из них добавим атрибут нанесения удара:
kick_level = random.randrange(1, 15)
Для большего интереса представим ситуацию: два бойца (каждый из которых, напомню, является объектом) наносят удары друг другу поочередно. Сила удара колеблется от единицы до пятнадцати. Кто достиг отметки в нуль единиц жизни первый — проиграл.
В полном виде код выглядит так:
-
import random #Подключаем библиотеку, отвечающую за генерацию случайных значений
-
rounds = 1 #Создаем переменную, которая считает раунды
-
-
class Fighter(): #Создаем класс "Боец", который имеет общие для обоих бойцов атрибуты (характеристики)
-
health = 100 #Максимальный уровень жизни
-
dead_level = 0 #Минимальный уровень жизни
-
-
class F1(Fighter): #Создаем класс "Боец 1", который наследует атрибуты класса "Боец" (родительский класс указан в скобке)
-
kick_level = random.randrange(1, 15) #Генерируем силу удара бойца
-
-
class F2(Fighter): #Создаем класс "Боец 2", которые наследует атрибуты класса "Боец" (родительский класс указан в скобке)
-
kick_level = random.randrange(1, 15) #Генерируем силу удара бойца
-
-
f1 = F1() #Создаем переменную, которая содержит класс "Боец 1"
-
f2 = F2() #Создаем переменную, которая содержит класс "Боец 2"
-
-
print('Изначально:\nБоец 1 имеет здоровья:', Fighter.health, '\nБоец 2 имеет здоровья:', Fighter.health) #Выводим начальное значение уровня здоровья бойцов - для этого используем значение health из класса Fighter
-
while f1.dead_level <= f1.health or f2.dead_level <= f2.health: #Создаем цикл, который будет работать пока значение здоровья первого или второго бойца не достигнут минимального значения здоровья (dead.level) класса Fighter
-
print('\nРаунд:', rounds)
-
print('Боец 1:', f2.health, 'жизни\nБоец 2:', f2.health, 'жизни')
-
print('Боец 1 бьет Бойца 2 с силой:', f1.kick_level) #Переменная f1(класс F1) бьет с силой, которая генерируется атрибутом силы удара (kick_level)
-
f2.health = f2.health - f1.kick_level #Перезаписываем значение уровня здоровья в классе "Боец 1 (F1)"
-
print('После удара у Бойца 2 осталось здоровья:', f2.health) #Выводим текущее значение уровня здоровья
-
if f2.health <= 0: #Делаем проверку на соответствие значению окончания боя
-
break #Если проверка ОК - выходим из цикла
-
-
print('Боец 2 бьет Бойца 1 с силой:', f2.kick_level) #Переменная f1(класс F1) бьет с силой, которая генерируется атрибутом силы удара (kick_level)
-
f1.health = f1.health - f2.kick_level #Перезаписываем значение уровня здоровья в классе "Боец 2 (F2)"
-
print('После удара у Бойца 1 осталось здоровья:', f1.health) #Выводим текущее значение уровня здоровья
-
if f1.health <= 0: #Делаем проверку на соответствие значению окончания боя
-
break #Если проверка ОК - выходим из цикла
-
rounds = rounds + 1 #Увеличиваем номер раунда на единицу
-
-
if f1.health > f2.health: #Определяем, какое сообщение выводить в случае победы того или иного бойца
-
print('Победил Боец 1')
-
else:
-
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.