我正在做一个练习,在这个练习中,你应该计算你的元素的优雅程度的分数。礼帽给你 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
当 self.classyItems 明明有 tophat 属性时,为什么 getattr 返回 None?
感谢大家的帮助!阅读答案后我仍然感到困惑,只是阅读字典键不是这里的属性对我有所帮助。 Is Python dict an Object?
请您参考如下方法:
getattr 访问属性和/或方法,但是 classyItems 是一个字典,它没有任何(可见的)属性1 和存储其内容为键值对2。
在您的情况下,您应该使用 dict.get代替 getattr,更具体地说是 self.classyItems.get(item, None),以访问默认值。
1虽然字典有可以使用 getattr 访问的方法。
2这就是您使用 d[key] 而不是 d.key 访问它们的原因。
