我正在制作dict类的派生变体,以便可以通过属性访问语法访问字典值(因此,您可以执行字典字典['foo'] .foo 。)这是我到目前为止所做的:
class dict(dict):
__getattr__ = dict.__getitem__
但是,我的代码片段给出了问题:
eventD = {'rrule_end':None}
. . .
. . .
#(some time later)
print event.rrule_end
这是因为字典创建的{}运算符没有被重载。是否可以使dictName = {}语法创建派生类的实例而不是普通字典?
答案 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