簡體   English   中英

對於類python的實例,getattr查找失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM