[英]getattr lookup fails for instance of class python
我正在做一個練習,您應該在其中計算出商品的優雅程度。 高頂禮帽給你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
?
感謝大家的幫助! 閱讀答案后,我仍然感到困惑,只是閱讀字典鍵不是這里的屬性對我有所幫助。 Python dict是對象嗎?
getattr
訪問屬性和/或方法,但是classyItems
是不具有任何(可見)屬性1的字典,並將其內容存儲為鍵值對2 。
在您的情況下,應該使用dict.get
而不是getattr
,更具體地說,使用self.classyItems.get(item, None)
來訪問默認值。
1字典具有可以使用getattr
訪問的方法。
2這就是為什么您使用d[key]
而不是d.key
訪問它們的原因。
getattr()
獲取一個對象和該屬性的字符串 ,然后返回該對象 。 您的對象中沒有名為item
的屬性,但是您有classyItems
:使用您的代碼,您可以看到:
>>> getattr(me, 'classyItems')
{'bowtie': 4, 'tophat': 2, 'monocle': 5}
使用self.classyItems.get(item, None)
會更容易(也更容易理解self.classyItems.get(item, None)
,它可以查找字典並返回默認值。 您不能使用getattr
查找字典值,但是可以檢查它是否具有某些方法:
>>> getattr(me.classyItems, 'update')
<built-in method update of dict object at 0x028ADE40>
將itemIsClassy = getattr(self.classyItems, item, None)
替換為itemIsClassy = self.classyItems.get(item, None)
如@Dharmesh和@MSeifert所述,將itemIsClassy = getattr(self.classyItems, item, None)
替換為itemIsClassy = self.classyItems.get(item, None)
您的代碼不起作用的原因不是因為classyItems
沒有太多屬性,而是因為getattr
函數對對象起作用,而不對字典起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.