2015-03-13 50 views
1

在一個已定義的對象中,一些值保存在dict中,我希望迭代該dict中的內容,就像引用一個普通的dict一樣,因此可以直接使用[]進行訪問,並使用例如循環使用。 .items()。代碼結構爲:如何在類中迭代`dict`就好像只是提到`dict`一樣?

class Klass: 

    def __init__(self, values): 
     self.values = values 
     self.more = None 

    def __getitem__(self, name): 
     return self.values[name] 

    def __iter__(self): 
     pass # TBD[How to make this ?] 

d = {'alfa': 1, 'bravo': 2, 'charlie': 3} 

k = Klass(d) 

for key in k: 
    print(key) # Expected to print keys from self.values 

for (key, value) in k.items(): 
    print(key, value) # Expected to print key and value from self.values 

for key in k.keys(): 
    print(key) # Expected to print key from self.values 

for value in k.values(): 
    print(value) # Expected to print value from self.values 

怎麼寫__iter__和其他必要的方法,所以這種訪問有可能通過克拉斯的實例?

+0

'for item in self.values:yield item'? – Torxed 2015-03-13 13:19:44

+0

OOP的意圖是隱藏特定的實現,因此應該避免直接引用實例屬性'.values'。 – EquipDev 2015-03-13 13:21:14

+1

@EquipDev:**在實現中**您仍然必須依賴您自己的狀態。 'Torxed'提出了'__iter__'的實現,使其成爲一個生成器函數。這裏不需要,不過不用'iter()',但是。 – 2015-03-13 13:23:34

回答

7

您必須自己實施.keys(),.values().items()方法;與__iter__他們一起都可以代表實際工作的self.values()詞典:

class Klass: 
    def __init__(self, values): 
     self._values = values 
     self.more = None 

    def __getitem__(self, name): 
     return self._values[name] 

    def __iter__(self): 
     return iter(self._values) 

    def keys(self): 
     return self._values.keys() 

    def items(self): 
     return self._values.items() 

    def values(self): 
     return self._values.values() 

我改名的屬性,以避免掩蓋.values()方法。

委託__iter__對字典進行迭代(按鍵)的最簡單方法是使用iter() function獲取字典對象的迭代器。

明確:__iter__在如何處理.keys(),.values().items()中沒有作用;後者是更多的方法

+0

感謝您的幫助,並將'values'重命名爲'_values';當必須實現'values'方法時,這是名稱的錯誤選擇。 – EquipDev 2015-03-13 13:29:39

+0

沒有必要實現'.keys()'等只是從'collections.abc.Mapping'的子類。 – Kevin 2015-03-13 13:29:47

+0

@凱文:是的,這是下一步。 「collections.abc.Mapping」然後實現這些方法的事實並不會減少這些方法需要實現的事實。 – 2015-03-13 13:32:36

1
class Klass(dict): 
     def __init__(self, *arg, **kw): 
      super(Klass, self).__init__(*arg, **kw) 
      self.choosebettername = super(Klass, self).keys() 

     def __iter__(self): 
      return iter(self.choosebettername) 

     def keys(self): 
      return self.choosebettername 

     def itervalues(self): 
      return (self[key] for key in self) 


    d = {'alfa': 1, 'bravo': 2, 'charlie': 3} 

    k = Klass(d) 

    for key in k: 
     print(key) # Expected to print keys from self.values 

    for (key, value) in k.items(): 
     print(key, value) # Expected to print key and value from self.values 

    for key in k.keys(): 
     print(key) # Expected to print key from self.values 

    print(k.values()) 

    for value in k.values(): 
     print(value) # Expected to print value from self.values 
相關問題