class python 的 getattr 查找失败

getattr lookup fails for instance of class python

我正在做一个练习,你应该计算 classy 你的物品的分数。礼帽给你 2 分,领结给你 4 分,单片眼镜给你 5 分。我已经在每个 class 实例上启动了一个包含这些项目的字典,但是当我使用 getattr 检查该项目是否具有属性时,它总是 returns 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

明明self.classyItems有tophat的属性,为什么getattr返回None

感谢大家的帮助!阅读答案后我仍然感到困惑,只是阅读字典键不是这里的属性对我有所帮助。 Is Python dict an Object?

getattr 访问属性 and/or 方法,但是 classyItems 是一个没有任何(可见)属性的字典 1 和将其内容存储为键值对2.

在您的情况下,您应该使用 dict.get 而不是 getattr,更具体地说 self.classyItems.get(item, None),以使用默认值访问值。

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

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

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

getattr() 接受一个 object 和一个 属性 string 到寻找并returns 那个对象。您的对象中没有名为 item 的属性,但您确实有 classyItems: 使用您的代码,您可以看到:

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

使用 self.classyItems.get(item, None) 查找字典和 returns 默认值更容易(且可读)。您不能使用 getattr 查找字典值,但是您可以检查它是否具有某些方法:

>>> getattr(me.classyItems, 'update')
<built-in method update of dict object at 0x028ADE40>

如@Dharmesh 和@MSeifert 所述,将 itemIsClassy = getattr(self.classyItems, item, None) 替换为 itemIsClassy = self.classyItems.get(item, None)

你的代码不起作用的原因不是因为 classyItems 没有很多属性,而是因为 getattr 函数适用于对象,而不是字典。