Невозможно добавить методы в список, который существует внутри включающего класса в Python - PullRequest
0 голосов
/ 28 января 2019

Вот мой вызов:

Я работаю над игрой и пытаюсь сохранить все способности игрока / врага встроенными в методы, чтобы быть более "питоническими" (извиняюсь, если яЯ неправильно использую выражение).

Я успешно смог собрать список методов из родительского класса (например, "Actor", здесь) как self.abilities, но я не могу добавить к этому жесписок в классе, который наследует «Актер».

Я провел некоторое исследование, и я понимаю, что наследование сложно, и есть много других способов прикрепить методы к каждому классу, но они в основном кажутся громоздкими и лишают цели иметьклассы вообще.

Вот снимок / пример того, что я хотел бы сделать:

livingThing -> Актер (может бить / лечить) -> Монстр (может бить /лечить / кастовать) -> Дракон (может ударить / лечить / кастовать / летать) -> и т. д.

Я стараюсь избегать воспроизведения одного и того же списка методов, из которых можно извлечь из каждой новой итерации классаи я также пытаюсь избежать превращения каждого объекта в этой игре в "Актер".

Поскольку, однако, у меня есть список способностей в init ,хотя я не могу получить к нему доступ вне метода.В настоящее время у меня есть Monster и Ally, которые просто «проходят», чтобы доказать себе, что они наследуют черты Actor, но я не могу изменить этот список нигде, кроме как в Actor.

Может кто-нибудь помочь?Спасибо!

# Anything that can interact directly (take action)
class Player(livingThing):
    def __init__(self,name="The Stranger", HP=10, MP=5, strength=1, intellect=1, spirit=1, luck=5, gil=6):
        self.name = name
        self.HP = HP
        self.MP = MP
        self.gil = gil
        self.strength = strength
        self.intellect = intellect
        self.spirit = spirit
        self.luck = luck

def act(player, enemy):
    actions = {
    "attack" : player.attack, 
    "heal" : player.heal, 
    "flee" : player.flee
    }
    #Takes input from the player
    player.safe = False
    while ((player.HP > 0) and (enemy.HP > 0)) and (player.safe != True):
        decision = input("What would you like to do? ")

        #Sets the user's input as lower-case and checks for it within the dictionary
        if decision.lower() in actions:
            actions[decision.lower()](enemy)
            if player.safe != True:
                enemy.agreact(player)
                player.printHP(enemy)

        else:
            print("That didn't workkkkkk!  Try again.")

# Prints both player and enemy HP
def printHP(player, enemy):
    print("{0}'s' HP: {1} \n{2}'s HP: {3}".format(player.name, player.HP, enemy.name, enemy.HP))

# Allows the player to attack an enemy (currently functional)
def attack(player, enemy):
    enemy.HP -= player.strength
    print("You strike {0} for {1} damage!".format(enemy.name, player.strength))
    #player.printHP(enemy)

# Allows the player to heal a certain amount of health based on its "spirit" stat (currently functional)
def heal(player, enemy):
    healed = randint(0, player.spirit)
    player.HP += healed
    print("You've healed for {0}!".format(healed))
    #player.printHP(enemy)

#Allows the player to attempt to run away
def flee(player, enemy):
    randluck = randint(0, player.luck)
    if randluck > 3:
        print("You successfully escaped!")
        player.safe = True
    else:
        print("You weren't able to escape!")


# Anything that can act with/against the player
class Actor(livingThing):
    def __init__(self, name="Unknown Entity", HP=10, MP=2, strength=1, intellect=1, spirit=3, gil=3):
        self. name = name
        self.HP = HP
        self.MP = MP
        self.gil = gil
        self.strength = strength
        self.intellect = intellect
        self.spirit = spirit
        self.abilities = [self.strike, self.heal]
        def printabilities():
            print(self.abilities)

    # Chooses how your opponent will respond to your attack
    def agreact(self, player):
        choice = randint(0, len(self.abilities)-1)
        self.abilities[choice](player)

    # A basic "hit back" reaction from your opponent--everyone can do this
    def strike(self, player):
        player.HP -= self.strength
        print("{0} hit {1} for {2}!".format(self.name, player.name, self.strength))

    def heal(self, enemy):
        healed = randint(0, self.spirit)
        self.HP += healed
        print("{0} healed for {1}!".format(self.name, healed))



class Monster(Actor):
    pass

class Ally(Actor):
    pass 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...