2016-09-22 29 views
1

我知道Python只會在for...in...語法中使用dict時返回密鑰列表。當我在python中循環一個字典時會發生什麼?

但是,字典發生了什麼?

當我們使用help(dict),我們不能在方法列表中看到__next()__方法。所以,如果我想使基於dict派生類:

class MyDict(dict) 
    def __init__(self, *args, **kwargs): 
     super(MyDict, self).__init__(*args, **kwargs) 

for...in...

d = Mydict({'a': 1, 'b': 2}) 
for value in d: 

返回值列表怎麼辦?

+2

爲什麼'dict'有'__next__'?它有'__iter__',並且該函數返回的對象支持'next'。你的類'MyClass'從它的基類'dict'繼承'__iter__',所以它具有與'dict'相同的行爲。 –

+1

請注意:這可能會讓您或其他人感到困惑:每個人都會期望遍歷這些鍵,並且突然我們在這裏獲得值(即使您的變量被命名爲「value」)。只需在'd.values()'中使用'作爲值;毫無疑問,這很明顯是怎麼回事。 – Evert

+0

我相信'yield'關鍵字和[Generators](https://wiki.python.org/moin/Generators)是你正在尋找的。 – Maurice

回答

0

天真,如果你想要過的MyClass一個實例來產生價值,而不是鍵,然後在MyClass是迭代的定義:

def __iter__(self): 
    return self.itervalues() 

在Python 3:

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

但要小心!通過這樣做,你的班級不再執行collections.MutableMapping的合同,即使issubclass(MyClass, collections.MutableMapping)爲真。如果這是你想要的行爲,而是有dict類型的屬性來保存數據,並且只實現你需要的函數和操作符,你可能會更好。

相關問題