1

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

class dict(dict): 
    __getattr__ = dict.__getitem__

但是,我的这段代码给它带来了问题:

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

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

4

2 回答 2

0

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

你必须明确地创建你的类的实例。给你的班级起一个像 MyDict 这样的名字,然后做

eventD = MyDict({'rrule_end':None})
于 2012-10-19T01:45:04.587 回答
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
于 2012-10-19T03:27:42.903 回答