对于类python

时间:2017-09-11 17:10:34

标签: python python-2.7 dictionary getattr

我正在做一个练习,你应该计算你的项目的优雅程度。高帽给你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显然具有tophat属性时,为什么None返回self.classyItems

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

4 个答案:

答案 0 :(得分:8)

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

在您的情况下,您应该使用dict.get代替getattr,更具体地说self.classyItems.get(item, None)来使用默认值来访问这些值。

1 字典包含可以使用getattr访问的方法。

2 这就是您使用d[key]代替d.key访问它们的原因。

答案 1 :(得分:2)

getattr()获取属性对象以查找并返回该对象< / strong>即可。您的对象中没有名为item的属性,但您确实拥有classyItems: 使用您的代码,您可以看到:

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

使用查找字典并返回默认值的self.classyItems.get(item, None)更容易(也更易读)。您无法使用getattr查找字典值,但是您可以检查它是否有某些方法:

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

答案 2 :(得分:-1)

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

答案 3 :(得分:-1)

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

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