【问题标题】:Decorator's classes cant change class variable装饰器的类不能改变类变量
【发布时间】:2019-06-11 17:19:22
【问题描述】:

我有职业英雄

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人=狂暴(人)

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

怎么了?

【问题讨论】:

  • 你的狂暴类 init 方法只接受一个参数(self),但你传递了 2,self 和 man
  • 你在哪里看到“装饰类”?或者您对“装饰器”的定义与 Python 的装饰器概念完全无关(参见en.wikipedia.org/wiki/Python_syntax_and_semantics#Decorators)?如果是,您可能应该编辑您的问题的标题。

标签: python python-decorators


【解决方案1】:

出现此错误的原因是因为Berserk 的构造函数不接受Man 类型的对象。因此,您必须做的是更改构造函数的参数,这样您就可以传入Berserk(man)

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

现在,由于 Berserk(man) 有 2 个参数,您应该不会收到错误消息。有关构造函数的更多信息,您可以查看this StackOverflow question,这可能会提供更多见解。

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 2021-05-24
    • 2011-07-17
    • 2012-08-14
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多