构造一个可以映射或未打包的对象

时间:2014-03-20 15:23:36

标签: python dictionary

所以我有这个(当然真正的事情更复杂):

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等,但似乎没有任何效果。

感谢。

1 个答案:

答案 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}不是一个好主意。