我可以重载{}运算符来创建字典吗?

时间:2012-10-19 01:43:53

标签: python overloading dictionary

我正在制作dict类的派生变体,以便可以通过属性访问语法访问字典值(因此,您可以执行字典字典['foo'] .foo 。)这是我到目前为止所做的:

class dict(dict): 
    __getattr__ = dict.__getitem__

但是,我的代码片段给出了问题:

eventD = {'rrule_end':None}
. . .
. . .
#(some time later)
print event.rrule_end

这是因为字典创建的{}运算符没有被重载。是否可以使dictName = {}语法创建派生类的实例而不是普通字典?

2 个答案:

答案 0 :(得分:0)

没有。您无法覆盖dict文字语法。 (您也不能覆盖列表文字语法,字符串文字语法,数字文字语法或任何文字语法。)

您必须显式创建类的实例。给你的班级一个像MyDict的名字,然后做

eventD = MyDict({'rrule_end':None})

答案 1 :(得分:0)

不,你不能重载这种语法,但它们是你可以做的另类事情。

将普通字典转换为字典

my_dict( {'foo':bar, 'foo2':bar2} )

让您的功能接受key-args

my_dict( foo='bar', foo2='bar2' )

为这本词典编写自己的语法。 这是滥用python的可重载运算符,并且有点复杂。 它是一个连锁反应,从my_dict<'foo'开始。 重载操作符,以便输出另一个my_dict对象并重复该过程, 每次记录每个值,直到最终到达最终对象。 然后它计算并吐出你自己的对象对象。

my_dict<'foo'|bar,'foo2'|'bar2'>end

编辑:

我不确定你想要这样做的原因,但这可能是你问题的另一种选择。您可能还想查看vars内置函数。这使您可以获得对象具有的每个属性的字典。如果对象发生变化,字典会自动更改。

class dict_obj(object):
    def __init__(self, obj):
        self.obj = obj
        self.dict = vars(obj)

    def __getattr__(self, value):
        return self.dict[value]
    __getitem__ = __getattr__

你可以像这样使用它

>>> class test:
    def __init__(self):
        self.value = 5


>>> obj = dict_obj(test())
>>> obj.value
5
>>> obj['value']
5