Классы в 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)

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

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

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.

Support the Blog!

Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️

PayPal Logo Donate via PayPal

Revolut Logo Donate via Revolut