我正在做一个练习,你应该计算你的项目的优雅程度。高帽给你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?
答案 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
函数适用于对象,而不是字典。