Я работаю над карточной боевой игрой, чтобы попрактиковаться в программировании на Python, и у меня есть объекты для игроков и карт.Я использовал functools.partial для присвоения способности каждому объекту карты при его создании, и до сих пор это работало так:
from functools import partial
class Player(object):
def __init__(self):
self.health = 100
def play_card(self, card):
card.ability(player=self)
human = Player()
computer = Player()
human.opponent = computer
computer.opponent = human
class Card(object):
def __init__(self, ability):
self.ability = ability
def attack(amount, player):
player.opponent.health -= amount
working_card = Card(partial(attack, 8))
human.play_card(working_card)
Это, очевидно, значительно упрощенная версия кода,но это важная частьКогда я вызываю human.play_card (working_card), объект Player выполняет функцию play_card (card = working_card), которая затем активирует частичную функцию working_card.ability (), инициируя атаку (количество = 8, игрок = человек).
Но затем я ввожу переменную в качестве одного из параметров частичной функции следующим образом:
broken_card = Card(partial(attack, player.health))
human.play_card(broken_card)
Функция частичной попытки пытается определить значение player.health, когда объект Cardсначала создается, когда он не знает, что такое «игрок».Вместо этого я хочу определить значение player.health, когда вызывается атака (количество, игрок), то есть когда «player» имеет значение.Я попытался с помощью лямбды и размещения функции attack () внутри объекта Card безуспешно, и я не смог найти никаких ответов на этот вопрос в Интернете.Мне нужен какой-то способ обойти частичную попытку определить player.health при первом его вызове, если не явно, то путем перестройки способа работы логики моего кода.