类python的实例的getattr查找失败

2024-05-20 20:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个练习,你应该计算一下你的物品有多高档。一顶大礼帽给你2分,一个蝴蝶结给你4分,一个单片眼镜给你5分。我已经在每个类实例上启动了一个包含这些项的字典,但是当我使用getattr检查该项是否具有属性时,它总是返回None。在

class Classy(object):

    def __init__(self):
        self.items = []
        self.classyItems = {'tophat': 2, 'bowtie': 4, 'monocle': 5}

    def addItem(self, str):
      self.items.append(str)

    def getClassiness(self):
      classiness = 0
      for item in self.items:
        itemIsClassy = getattr(self.classyItems, item, None) # Why does this always return none?
        if itemIsClassy:
          classiness += itemIsClassy
        else:
          pass
      return classiness


# Test cases
me = Classy()

# Should be 0
print me.getClassiness()

me.addItem("tophat")
# Should be 2
print me.getClassiness() # I'm getting 0

为什么getattr返回{},而self.classyItems显然具有tophat属性?在

谢谢大家的帮助!读完答案后,我还是很困惑,简单地读到字典键不是这里的属性,这对我有帮助。Is Python dict an Object?


Tags: selfnone字典属性tophatdefitemsme
3条回答

getattr()获取要查找的对象属性的字符串,并返回该对象。对象中没有名为item的属性,但有classyItems: 使用代码可以看到:

>>> getattr(me, 'classyItems')
{'bowtie': 4, 'tophat': 2, 'monocle': 5}

使用self.classyItems.get(item, None)查找dict并返回默认值,会更容易(并且可读)。不能用getattr查找dict值,但是可以检查它是否具有某些方法:

^{pr2}$

itemIsClassy = getattr(self.classyItems, item, None)替换为itemIsClassy = self.classyItems.get(item, None)

getattr访问属性和/或方法,但是classyItems是一个dict,它没有任何(可见)属性1,并将其内容存储为键值对2。在

在您的例子中,您应该使用^{}而不是getattr,更确切地说是{},来访问默认值。在

1字典有可以使用getattr访问的方法。在

2这就是为什么您使用d[key]而不是d.key来访问它们。在

相关问题 更多 >