属性错误:'function'对象没有属性

4

我一直在尝试制作一个游戏,但是这个错误一直出现。我是Python的初学者,所以希望大家能够看一下这个可怕的代码。

AttributeError: 'function' object has no attribute 'armorEquipped'

我非常困惑这是什么意思,能否有人给我解释一下?
normalarmor={
"TRAINING ARMOR":["Armor meant for training","no element", +10, " health"]}

firearmor={
    "LIGHTBRINGER":["Armor that brings light", "Fire element", +10, " health, Grass type deals less damage"]}

def equipArmor():
    print()
    m= True
    while m==True:
        z=True
        armorInInventory= len(normalarmor) + len(firearmor) +len(airarmor) +len(grassarmor)+len (waterarmor)
        armorInInventory=int(armorInInventory)
        print ("You have", armorInInventory, "armors")
        print ("You have these armors:")
        for name6 in airarmor:
            print(name6)
        for name2 in normalarmor:
            print(name2)
        for name3 in firearmor:
            print (name3)
        for name7 in grassarmor:
            print (name7)
        for name9 in waterarmor:
            print (name9)
        print ("Which armor would you like to equip or view")
        equipArmor.armorEquipped=input()
        equipArmor.armorEquipped= equipArmor.armorEquipped.upper()
        if (equipArmor.armorEquipped in normalarmor or
            equipArmor.armorEquipped in waterarmor or
            equipArmor.armorEquipped in firearmor or
            equipArmor.armorEquipped in airarmor or
            equipArmor.armorEquipped in grassarmor):
            if equipArmor.armorEquipped in normalarmor:
                print (normalarmor[equipArmor.armorEquipped])
                while z== True:
                    print ("Equip? Yes or No")
                    variable1= input()
                    variable1=variable1.upper()
                    if variable1== "YES":  
                        print (equipArmor.armorEquipped, "Equipped")
                        m= False
                        z= False
                    elif variable1 == "NO":
                        z= False

                        m=True
                    else:
                        print ("That is not a valid answer")
                        z=True
            if equipArmor.armorEquipped in firearmor:
                print (firearmor[equipArmor.armorEquipped])
                while z== True:
                    print ("Equip? Yes or No")
                    variable1= input()
                    variable1 =variable1.upper()
                    if variable1== "YES":  
                        print (equipArmor.armorEquipped, "Equipped")
                        m= False
                        z= False
                    elif variable1 == "NO":
                        z= True
                    else:
                        print ("That is not a valid answer")
                        z=True
            if equipArmor.armorEquipped in airarmor:
                print (airarmor[armorEquipped])
                while z== True:
                    print ("Equip? Yes or No")
                    variable1= input()
                    variable1=variable1.upper()
                    if variable1== "YES":  
                        print (armorEquipped, "Equipped")
                        z= False
                        m=False
                    elif variable1 == "NO":
                        z= False
                        m=True
                    else:
                        print ("That is not a valid answer")
                        z=True
            if equipArmor.armorEquipped in grassarmor:
                print (grassarmor[equipArmor.armorEquipped])
                while z== True:
                    print ("Equip? Yes or No")
                    variable1= input()
                    variable1= variable1.upper()
                    if variable1== "YES":  
                        print (equipArmor.armorEquipped, "Equipped")
                        x= False
                    elif variable1 == "NO":
                        m=True
                        z= False
                    else:
                        print ("That is not a valid answer")
                        z=True
            if equipArmor.armorEquipped in waterarmor:
                print (waterarmor[equipArmor.armorEquipped])
                while z== True:
                    print ("Equip? Yes or No")
                    variable1= input()
                    variable1= variable1.upper()
                    if variable1== "YES":  
                        print (equipArmor.armorEquipped, "Equipped")
                        x= False
                    elif variable1 == "NO":
                        m=True
                        z= False
                    else:
                        print ("That is not a valid answer")
                        z=True

并且在这里会出现问题:

def tutorial():
    x=True
    uhealth= normalarmor[equipArmor.armorEquipped][2]+uhealth 

为什么会出现这个问题,这个问题是什么? 请帮我!

在代码中,equipArmor 是如何定义的? - Bill Bell
哦,糟糕,我忘记分享主要的代码了。抱歉! - ypranite
2个回答

5

首先,让我们直奔主题。虽然它可能会出现在函数内的函数属性,但这不是人们所期望的功能。然而,函数的属性可以在外部设置。

>>> def f():
...     f.a = 1
...     return 42
... 
>>> f.a
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'function' object has no attribute 'a'
>>> f.b = 2
>>> f.b
2

虽然我不清楚您想要完成什么,但可能__call__可以实现。现在,这个class的对象就像一个函数一样运行,同时函数也可以设置对象的属性。

>>> class EquipArmour:
...     def __call__ (self, param):
...         if param == 1:
...             self.armourEquipped = 52
...         else:
...             self.armourEquipped = -34
... 
>>> equiparmour = EquipArmour()
>>> result = equiparmour(1)
>>> if equiparmour.armourEquipped == 34:
...     'say hello'
... 

我不太明白你的回答。我不确定__call__函数具体是做什么的。 - ypranite
__call__是Python对象内的特殊名称之一。在这段代码中,我写了equiparmour(1),实际上就像写了equiparmour(1).__call__(1)。但美妙的是,equiparmour是一个对象。与函数不同,它可以有属性(和其他方法)。这意味着,虽然我不能在函数中设置诸如armourEquipped之类的属性,但我可以在对象中设置。然而,我仍然可以像使用函数一样使用该对象。我得到了两个世界的东西,这正是你一开始想要的。如果还不清楚,请继续问。 - Bill Bell

1

@TheGamerCow 我有一台24英寸的屏幕,但你的代码超出了屏幕范围。

我将其替换为以下内容:

 if (equipArmor.armorEquipped in normalarmor or
        equipArmor.armorEquipped in waterarmor or
        equipArmor.armorEquipped in firearmor or
        equipArmor.armorEquipped in airarmor or
        equipArmor.armorEquipped in grassarmor):

请检查 多行条件 的样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接