Классы декоратора не могут изменить переменную класса - PullRequest
0 голосов
/ 17 января 2019

У меня есть герой класса

class Hero:
    def __init__(self):
        self.positive_effects = []
        self.negative_effects = []

        self.stats = {
            "HP": 128,
            "MP": 42,
        "SP": 100,

        "Strength": 15,
        "Perception": 4,
        "Endurance": 8,
        "Charisma": 2,
        "Intelligence": 3,
        "Agility": 8,
        "Luck": 1
    } 

def get_positive_effects(self):
    return self.positive_effects.copy()

def get_negative_effects(self):
    return self.negative_effects

def get_stats(self):
    return self.stats.copy()

Мне нужно создать заклинание декоратора, например:

class AbstractEffect(Hero):
    def __init__(self, base):
            self.base = base

    def get_stats(self):
            self.base.get_stats()   

    def get_positive_effects(self):
        self.base.get_positive_effects()

    def get_negative_effects(self):
        self.base.get_negative_effects()

class Berserk(AbstractEffect): 
    def __init__(self):
        self.positive_effects.append('Berserk')
        self.stats.HP += 50
        self.stats.Strength += 7
        self.stats.Endurance += 7
        self.stats.Agility += 7
        self.stats.Luck += 7
        self.stats.Intelligence -= 3
        self.stats.Perception -= 3
        self.stats.Charisma -= 3

, но когда я его использую, я получаю ошибку

man = Hero()
man = Berserk(man)

TypeError Traceback (последний последний вызов) в () ----> 1 человек = Berserk (мужчина)

TypeError: __init__() takes exactly 1 argument (2 given)

Что не так?

1 Ответ

0 голосов
/ 17 января 2019

Причина возникновения этой ошибки заключается в том, что конструктор Berserk не принимает объект типа Man. Следовательно, вам нужно изменить аргументы конструктора, чтобы вы могли передать Berserk(man).

class Berserk(AbstractEffect): 
    def __init__(self, man):
        #....
        self.stats.Charisma -= 3

Теперь, поскольку Berserk(man) принимает 2 аргумента, вы не должны получить ошибку. Для получения дополнительной информации о конструкторах вы можете проверить этот вопрос StackOverflow , который может дать более глубокое понимание.

...