我正在尝试公开类字典,使其既可订阅又可订阅,并能够遍历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)
如何使该对象的字典既可以下标又可以迭代?
答案 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已经实现了它,因此您只是在这里代理它。