Объявите атрибуты класса внутри для l oop в python - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь создать игру, которая является кражей из Клана sh. Первое, что нужно сделать, это создать классы для войск и заклинаний, используемых во время фазы атаки. Я определил класс Tr oop, который является общим классом, и идея состоит в том, что все его атрибуты будут перезаписаны при объявлении указанных c войск. Вот голый костяк Tr oop класса

class Troop():
    def __init__(self):
        self.fav_target = 'any'
        self.damage_type = 'single' #or 'area'
        self.targets = 'ground'
        self.space = 1
        self.speed = 1
        self.dps = 1
        self.hp = 1
        self.type = 'ground' #or 'air'
        self.level = 1
        self.attack_rate = 1

Cla sh кланов имеет много войск, и атрибуты каждого войска (например, hp, dps) меняются с уровнем. На данный момент я реализовал только эти атрибуты для максимально возможного уровня. Чтобы сохранить все значения атрибутов для указанных c войск, я объявил словари. Вот словарь атрибутов для "варвара" tr oop. Формат: {'<troop lvl>': {'<attr>': <value>}}

barbs = {'9': {'fav_target': 'any', 'damage_type': 'single', 'targets': 'ground', 'space': 1, 'speed': 16, 
        'dps': 38, 'hp': 230, 'type': 'ground', 'attack_rate': 1}}

Вместо того чтобы вручную перезаписывать каждый атрибут внутри класса варваров, я подумал использовать для l oop, чтобы перезаписать все атрибуты внутри класса варваров, например так:

class Barbarian(Troop):
    def __init__(self):
        super(Barbarian, self).__init__()
        self.name = 'Barbarian'
        for attr in barbs['9']:
            self.attr = barbs['9'][attr]

Проблема в том, что когда я печатаю Barbarian.hp, он возвращает значение внутри класса Tr oop вместо класса Barbarian. Если я удаляю оператор super (), то при печати чего-то вроде Barbarian.hp выдается ошибка AttributeError.

Есть ли способ перезаписать (или объявить) атрибуты внутри класса внутри для l oop?

1 Ответ

0 голосов
/ 10 апреля 2020

Добавить параметр **kwargs; используйте setattr in __init__; передать словарь экземпляру.

class Barbarian(Troop):
    def __init__(self,**kwargs):
        super(Barbarian, self).__init__()
        self.name = 'Barbarian'
        for attr,value in kwargs.items():
            setattr(self,attr,value)

b = Barbarian(**barbs['9'])
...