Python - 对象没有属性错误

Fie*_*man 6 python attributes field object

我在一个单独的文件中从头开始重写了整个类,一切都神奇地工作,条件等等。所以,我只是将这个类和几个函数从新文件导入到主文件中。我仍然不知道第一次出了什么问题。

请注意,以下问题已在技术上得到解决。您可以在代码底部看到拼写错误。但是,这发现了一个问题,即我的所有条件(if、try 等)都停止运行,这就是我在单独的模块中重新编写该类的原因

我会删除这篇文章,因为它让每个人都无处可去,但这显然不是 Stack Overflow 上的工作方式。

好的,我一直在学习 Python 3.4 并决定做一些功课作为练习。我开始制作一个脚本来模拟两个人的战斗,然后用我学到的任何新东西(例如添加一个 GUI)来扩展它。

脚本开始时很好,但我所做的更改越多,出现的错误就越多。现在到了我无法访问“战斗机”类的任何字段而不抛出错误的地步,例如:

'duelist' object has no attribute '_duelist__health'
Run Code Online (Sandbox Code Playgroud)

除了“ 'duelist' 对象没有属性'_duelist__XXX' ”之外,除了拼写错误之外,我还有 0 个其他错误。不幸的是,谷歌无法帮助解决这个问题,所以这就是我发表我的第一篇 StackOverflow 帖子的原因。

这是第一个错误快乐字段“健康”的类:

class duelist:
    def __init__(self):
        self.name = "Duelist" #must not be ""
        self.health = 5 #must be >0
        self.damage = [1, 3] #random attack range. Must be >=0 0 and the first must not be higher.
        self.skill = 10 #% chance to pass a skill check. Representative of parrying/dodging. Must be >=0
        self.shield = True #can block?
        self.shieldE = 80 #max block %. Must be >0
        self.agility = 0.5 #rate of attack in seconds. Must be >=0.05
        self.precision = 10 #critical hit chance. Must be >=0
        self.critical = 2.0 #critical multiplier. Must be >= 1.1


    #name
    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        if value != "":
            self.__name = value
        else:
            print("Invalid Name.\n")
    #name

    #health
    @property
    def health(self):
        return self.__health

    @health.setter
    def health(self, value):
        try:
            value = value(int)
            if value>=1:
                self.__health = value
            else:
                print("Health must be above 0.\n")
        except:
            print("Invalid Health.\n")
    #health
Run Code Online (Sandbox Code Playgroud)

此外,对于那些建议更改字段名称以不包含“ __ ”(或到处包含“ __ ”)的人,这会导致无限循环。准确键入:

class duelist:
    def __init__(self):
        self.health = 5

    @property
    def health(self):
        return self.__health

    @health.setter
    def health(self, value):
        self.__health = value

D = duelist()
print(D.health)
D.health = 15
print(D.health)
Run Code Online (Sandbox Code Playgroud)

正确返回

5
15
Run Code Online (Sandbox Code Playgroud)

Tes*_*ler 3

您的代码执行以下操作:

  1. .name =设置里面的值__init__()
  2. 它通过设置器,并设置.__name =
  3. 当你读取它时,.name它会读取 getter,并读取.__name

而你对问题的描述“我无法访问“战斗机”类的任何字段”,我怀疑是错误的,因为访问一些字段是有效的。

然而,健康却没有,在第 45 行你可以看到:

value = value(int)
Run Code Online (Sandbox Code Playgroud)

代替

value = int(value)
Run Code Online (Sandbox Code Playgroud)

这会导致 getter 抛出异常print("Invalid Health.\n")并且__health不会被设置。

对于self.shield = True,设置器正在尝试执行以下操作:

if value.lower() == 'y':
Run Code Online (Sandbox Code Playgroud)

并且您无法调用lower()布尔值,因此它在尝试调用之前就崩溃了type(value) == bool,并且__shield永远不会被设置。