Python类是可订阅但不可迭代的

时间:2019-07-06 16:20:33

标签: python class dictionary object

我正在尝试公开类字典,使其既可订阅又可订阅,并能够遍历dict值。这是课程:

l = [1,2,3]
[num if not idx else 0 for num in l for idx in range(6)]

如果我们创建实例并传递这些值:

class ExampleClass():
    def __init__(self, *args, **kwargs):
        for key, value in self.kwargs.items():
            setattr(self, key, value)
        for arg in args:
            setattr(self, arg, arg) if isinstance(arg, str) else setattr(self, str(arg), arg)
    def __str__(self):
        return 'This is the example class'
    def __getitem__(self, obj):
        return self.__dict__[obj]
    def __len__(self):
        return len(self.__dict__.items())

这会将所有args和kwargs存储为实例属性,并且使用语法cls = ExampleClass(123456,'cash', name='newexample', id=1) 将按预期返回1。但是,当我使用语法cls['id']时,出现KeyError:for i in cls: print(i)

如何使该对象的字典既可以下标又可以迭代?

1 个答案:

答案 0 :(得分:2)

您需要实现__iter__方法。

class ExampleClass():
    def __init__(self, *args, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)
        for arg in args:
            setattr(self, arg, arg) if isinstance(arg, str) else setattr(self, str(arg), arg)
    def __str__(self):
        return 'This is the example class'
    def __getitem__(self, obj):
        return self.__dict__[obj]
    def __len__(self):
        return len(self.__dict__.items())
    def __iter__(self):
        return iter(self.__dict__)

cls = ExampleClass(123456,'cash', name='newexample', id=1)
print(cls['cash'])
print(cls['name'])
for i in cls: print(i)

此方法被调用来为您的类型创建一个迭代器,以便可以对其进行迭代。您的基础dict已经实现了它,因此您只是在这里代理它。