Моя цель - создать группу (производных) классов, которые возвращают одни и те же структурированные данные / переменные при вызове их основного метода "run".Другими словами, когда вызывается метод run, он должен возвращать «a, b, c, d, e, f, g» и так далее.
Для демонстрации я придумал пример игры, в которой базовый класс равен Enemy
, а два возможных подкласса - Kobold
и Crow
.Основной метод "run" - do_battle
, и результат этого сражения должен возвращать player_hp_lost
и gold_dropped
, а также любую дополнительную информацию, которая хранится в other
.
Здесь это в коде
import abc
from typing import Dict
class Enemy(abc.ABC):
def __init__(self, health: int, armor: int):
self.health
self.armor
def generate_battle_results(self,
player_hp_lost: int,
loot_dropped: int,
other: Dict):
battle_results = {
"player_hp_lost": player_hp_lost,
"gold_dropped": loot_dropped,
"other": other
}
@abc.abstractmethod
def do_battle(self)
class Kobold(Enemy)
def __init__(self, rage_level: int, *args, **kwargs):
self.rage_level = rage_level
super().__init__(*args, **kwargs)
def do_battle(self):
# some convoluted logic that results in player hp lost, loot dropped, etc
player_hp_lost = 5
gold_dropped = 0
other = {"time taken to finish battle": 10,
"fun had": 2
}
return self.generate_battle_results(player_hp_lost=player_hp_lost,
gold_dropped=gold_dropped,
other=other)
def Crow(Enemy)
def __init__(self, num_feathers: int, *args, **kwargs):
self.num_feathers = num_feathers
super().__init__(*args, **kwargs)
def do_battle(self):
# some convoluted logic that results in player hp lost, loot dropped, etc
player_hp_lost = 3
gold_dropped = 1
other = {"kaw kaws before death": 10,
"estimated annoyance factor":6
}
return self.generate_battle_results(player_hp_lost=player_hp_lost,
gold_dropped=gold_dropped,
other=other)
В приведенном выше примере я хочу, чтобы do_battle
всегда возвращал player_hp_lost
и gold_dropped
.Тем не менее, обратите внимание, что пользователь может создать новый подкласс Enemy
и не вызывать self.generate_battle_results
и вернуть диктовку по своему выбору, чего я хочу избежать.Есть ли способ сделать это?