如何迭代 class 中的 `dict` 就像只引用 `dict` 一样?
How to iterate over `dict` in class like if just referring to `dict`?
在定义的对象中,一些值保存在 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()
function 获取字典对象的迭代器。
明确地说:__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
在定义的对象中,一些值保存在 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()
function 获取字典对象的迭代器。
明确地说:__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