2015-09-05 58 views
2

所以我創建了一個對象「項目」,這包含一個列表類型錯誤:類型「項目」的說法是不迭代

 for item in stock_list: 
      item_list = item.split(",") 
      self.__items += [Item(item_list[0], item_list[1], float(item_list[2]), int(item_list[3]))] 

當試圖找到它的代碼相匹配的項目(索引中的列表0)我想創建一個新的函數返回這個項目

def find_item(self, code): 
    for item in self.__items: 
     if code in item: 
      print(item) 

當我運行這個它給了我TypeError: argument of type 'Item' is not iterable錯誤,我想不通爲什麼? 我應該創建一個返回私有self .__代碼的getCode()函數嗎?或者這不會有什麼區別?

+0

什麼是代碼,它的類型是什麼?你想匹配什麼? –

+1

您可能必須在您的Item類中添加一個'__iter __()'方法 –

+0

@Shari'self .__ items'不是您認爲它最有可能的東西。它可能只是一個「Item」,而不是它的一個列表。 –

回答

0

我猜線出現問題 -

if code in item: 

自定義類的,你不能做 - x in C - 其中C是一個自定義的類的對象(實例),除非自定義類有一個__contains__()方法。示例 -

>>> class CC: 
...  pass 
... 
>>> class CB: 
...  def __contains__(self, item): 
...    if item == 1: 
...      return True 
...    else: 
...      return False 
... 
>>> cco = CC() 
>>> cbo = CB() 
>>> 1 in cco 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'CC' is not iterable 
>>> 1 in cbo 
True 
>>> 2 in cbo 
False 

但考慮到這一點,__contains__()基本上是用於成員資格測試,其中一個對象可以包含多個元素(以列表/字典爲例),

如果你想比較碼等於self.__code等其他變量。然後,您需要提供返回__code的某種方法(或屬性),如果__code又是某種列表或類似內容,並且您試圖檢查item是否在self.__code中,那麼您可以覆蓋如上所示的__contains__()

相關問題