这让我发疯。下面是我正在玩的class
,目标是要有一种方法来支持动态属性分配。 请暂时忘记执行不力或为什么我不只是使用字典,我知道还有其他方法可以做到这一点(例如Enum
),但这是我的测试代码以前和现在,我一直在寻找为什么它不起作用。
class Family(object):
def children(self):
return self.__dict__.values()
def __setitem__(self, key, value):
self.__dict__[key] = value
def __getitem__(self, item):
return self.__dict__[item]
def __repr__(self):
return str(self.__dict__)
def __iter__(self):
return self.__dict__.items()
一切似乎都很好,我按如下所示启动了一个测试对象:
foo = Family()
foo.a = 'foo'
foo.b = 'bar'
[i for i in foo]
现在预期的结果是[('a', 'foo'), ('b', 'bar')]
,但是我得到的却是:
TypeError: iter() returned non-iterator of type 'dict_items'
我认为我可能搞砸了__iter__
方法,因此我进行了如下检查:
type(foo.__iter__())
# <class 'dict_items'>
type(foo.__dict__.items())
# <class 'dict_items'>
[i for i in foo.__dict.__items()]
# [('a', 'foo'), ('b', 'bar')]
foo.__dict__.items() == foo.__iter__()
# True
如果它们都相同,为什么[i for i in foo]
不起作用?
答案 0 :(得分:3)
那呢:
def __iter__(self):
return iter(self.__dict__.items())
Python需要一个iterator
,而不是list
(或其他类似列表/类似字典的对象)
请记住:list
或dict
不是iterator
,iterator
通常是(为了易于理解)指向以下项的指针(光标) list
或dict
。