如何在课堂上迭代“字典”,就像只是提到“字典”一样



在一个定义的对象中,一些值保存在一个dict中,我想像引用普通dict一样迭代该dict中的内容,因此使用[]直接访问,并使用例如 .items() . 代码结构为:

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__和其他必需的方法,以便通过 Klass 实例进行这种访问?

你必须自己实现.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() 函数获取字典对象的迭代器。

明确地说:__iter__在如何处理.keys().values().items()方面没有作用;后者只是更多的方法

    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 

最新更新