2016-09-22 28 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类型的属性来保存数据,并且只实现你需要的函数和操作符,你可能会更好。

相关问题