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
函数适用于对象,而不是字典。
我正在做一个练习,你应该计算 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
函数适用于对象,而不是字典。