所以我有这个(当然真正的事情更复杂):
class test(object):
i = -1
def keys(self):
return ["a", "b"]
def __getitem__(self, item):
return {"a": 0, "b": 1}[item]
def __len__(self):
return 2
def __contains__(self, item):
if item in ["a", "b"]:
return True
return False
def __iter__(self):
return self
def next(self):
self.i += 1
if self.i > 1:
raise StopIteration()
return ["a", "b"][self.i]
我想要做的是(真正的事情更复杂):
> t = test()
> dict(t)
{'a': 0, 'b': 1}
> dict(**t)
{'a': 0, 'b': 1}
这项工作完美,但是如果我将类定义为dict的子类,则无法工作,这就是我想要的,我希望我的对象表现得像一个带有一些隐藏技巧的dict(并再次确定它)在实际代码中更有意义):
class test(dict):
.... same code here ....
在这种情况下,dict(t)
和dict(**t)
将返回空字典{}
,但[k for k in t]
将返回['a','b']
。
我想念什么?看来我确实需要重新声明一些dict函数,虽然__getitem__, __iter__, __len__, __contains__ and keys
方法足以完成这个技巧。我试图重新声明iterkeys,itervalues,copy,get等,但似乎没有任何效果。
感谢。
答案 0 :(得分:0)
class test(dict):
i = -1
def __init__(self):
super(test, self).__init__({"a": 0, "b": 1})
def keys(self):
return ["a", "b"]
def __getitem__(self, item):
return {"a": 0, "b": 1}[item]
def __len__(self):
return 2
def __contains__(self, item):
if item in ["a", "b"]:
return True
return False
def __iter__(self):
return self
def next(self):
self.i += 1
if self.i > 1:
raise StopIteration()
return ["a", "b"][self.i]
t = test()
print dict(t)
# output: {'a': 0, 'b': 1}
print dict(**t)
# output: {'a': 0, 'b': 1}
当然,类定义中的硬编码{'a': 0, 'b': 1}
不是一个好主意。