Как назначить переменную класса «динамически» в Python? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть следующий код:

class Potion(object):
    def __init__(self,name,var,varamount):
        self.name=name
        self.var=var
        self.varamount=varamount

class Inventory(object):
    def __init__(self):
        self.items={}
    def use_potion(self,potion):
        potion.var+=potion.varamount
        print("Used a ",potion.name," !")

class Player():
    def __init__(self):
        self.health=100
        self.mana=100
        self.stamina=100

inventory=Inventory()
player=Player()
healthpotion=Potion("Health potion",player.health,50)
inventory.use_potion(healthpotion)

Здесь мое зелье здоровья должно добавить 50 к переменной player.health.Но player.health остается без изменений, только healthpotion.var изменяется.Предполагая, что мне нужны разные типы зелий (выносливость, мана, здоровье), как я могу динамически назначить player.health, player.stamina и player.mana на potion.var?

Ответы [ 4 ]

0 голосов
/ 16 декабря 2018

Вы используете объекты.Объекты «знают» вещи - значения своих атрибутов - и объекты могут отправлять сообщения друг другу - вызывая их методы.

В этом случае:

  • Player знает своиздоровье.
  • Potion знает, насколько это может увеличить здоровье на
  • Inventory знает, есть ли у него зелье.
  • Player должно иметьинвентарь
  • Player может выбрать использование предметов в своем инвентаре
  • Inventory отслеживает, использовался ли предмет

На основании этих фактов,мы знаем, какие методы и атрибуты нужны нашим классам.

Зелье должно знать, сколько очков здоровья он может восстановить

class Potion(object):

    def __init__(self,name, varamount):
        self.name=name
        self.varamount=varamount

Инвентаризация должна отслеживать его содержимое.

class Inventory(object):
    def __init__(self):
        self.items={}

    def add_potion(self, potion):
        self.items['potion'] = potion

    def get_potion(self):
         return self.items.get('potion')

    def remove_potion(self):
        self.items.pop('potion', None)

Игрок должен иметь возможность отслеживать свое здоровье и использовать зелья.

class Player():
    def __init__(self, inventory):
        self.health=100
        self.mana=100
        self.stamina=100
        self.inventory = inventory

    def use_potion(self):
        potion = self.inventory.get_potion()
        if potion:
            self.health += potion.varamount
            self.inventory.remove_potion()
        print("Used a ",potion.name," !")

inventory=Inventory()

healthpotion=Potion("Health potion", 50)
inventory.add_potion(healthpotion)

player=Player(inventory)
player.use_potion()
0 голосов
/ 16 декабря 2018
class Potion():
    def __init__(self,name,var,varamount):
        self.name=name
        self.var=var
        self.varamount=varamount

class Inventory():
    def __init__(self):
        self.items={}

    def add_item(self, item):
        if item in self.items.keys():
            self.items[item] += 1
        else:
            self.items[item] = 1
        print ('Added a {} potion!'.format(item.name)

    def remove_item(self, item):
        if item in self.items.keys():
            self.items[item] -= 1
            return True
        else:
            print ('No such {} exists!'.format(item.name))
            return False


class Player():
    def __init__(self):
        self.health=100
        self.mana=100
        self.stamina=100
        self.inventory = Inventory()

    def use_item(self, item):
        if isinstance(item, Potion):
            if self.inventory.remove_item(item):
                if item.var == 'health':
                    self.health += item.varamount
                    print ('Used a {0} and healed {1}!'.format(item.name, item.varamount))

player=Player()
healthpotion=Potion("Health potion", 'health', 50)
player.use_item(healthpotion)
player.inventory.add_item(healthpotion)
player.use_item(healthpotion)

#No such Health potion exists!
#Added a health potion!
#Used a Health potion and healed 50!

Вы должны продумать, как ваши объекты работают в первую очередь.

Использует ли инвентарь зелье, или игрок использует зелье?

В коде, который я предоставил, у класса Player был свой инвентарь.И тогда игрок может использовать зелье, которое было добавлено в его собственный инвентарь.

0 голосов
/ 16 декабря 2018

Причина, по которой это не работает, в том, что вы передали аргумент player.health в Potion, это то же самое, что написать:

Potion("Health potion",100,50)
0 голосов
/ 16 декабря 2018

Вам необходимо отправить созданный экземпляр Player, а не только значение их атрибута:

class Potion(object):
    def __init__(self,name,var,varamount):
        self.name=name
        self.var=var
        self.varamount=varamount

class Inventory(object):
    def __init__(self):
        self.items={}
    def use_potion(self,potion):
        # Your potion.var contains Player instance. Access players health.
        potion.var.health += potion.varamount
        print("Used a ",potion.name," !")

class Player():
    def __init__(self):
        self.health=100
        self.mana=100
        self.stamina=100

inventory=Inventory()
player=Player()
healthpotion=Potion("Health potion",player,50) # Send player instance.
print(player.health) # 100
inventory.use_potion(healthpotion)
print(player.health) # 150
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...