假设满足我这个要求的对象是classdic,则它有如下特征:1.查询,更新,增加,删除数据皆可以通过两种方式(字典风格,类风格)2.当不存在类属性x时,该对象能自动创建一个值等于defaults属性x和...
假设满足我这个要求的对象是classdic,则它有如下特征:
1.查询,更新,增加,删除数据皆可以通过两种方式(字典风格,类风格)
2.当不存在类属性x时,该对象能自动创建一个值等于defaults属性x和键x.
3.当不存在字典键x时,该对象能自动创建一个值等于defaults键x和属性x.
我该怎么做?
下面是举例:
dic={'one':1,
'two':{'four':4,'five':{'six':6,'seven':7}},
'three':3}
cdic=classdic(dic,default=100)
-------------------任意两种方式查询-------------------------------------------
>>> cdic.one
1
>>> cdic.two
{'four':4,'five':{'six':6,'seven':7}}
>>> cdic.two.five.six
6
>>> cdic['two']['five']['six']
6
-------------------任意两种方式更新-------------------------------------------
>>> cdic['two']['five']['six']=7
>>> cdic.two.five.six
7
>>> cdic.two.five.six=8
>>> cdic['two']['five']['six']
8
-------------------任意两种方式增加-------------------------------------------
>>> cdic['two']['five']['eight']=8
>>> cdic.two.five.eight
8
>>> cdic.two.five.nine=9
>>> cdic['two']['five']['nine']
9
-------------------任意两种方式都有强大的防错机制-------------------------------------------
>>> print cdic['ten']
100
>>> cdic.ten
100
>>> print cdic.eleven
100
>>> cdic['eleven']
100
-------------------最终结果展示-------------------------------------------
>>> cdic
{'eleven': 11, 'three': 3, 'two': {'four': 4, 'five': {'nine': 9, 'seven': 7, 'six': 8, 'eight': 8}}, 'ten': 10, 'one': 1}
还有2个疑问:
1.对于Python对象的特殊方法.例如__init__,__getattr__,__setattr__,__getitem__等,在重写这些方法之前,我从哪里可以知道定义这些方法的代码呢?
比如在看你的答案之前,我就不知道dict对象的__init__方法的第二个参数是传入字典的(init_dict).我也不知道一个方法究竟要不要写个return来返回值...所以根本无法下手= =
2.我改了下你的写法,避免加载operator模块,经测试,暂时没有发现不对的地方,能作为替代品吗?
def __getattr__( self ,key ):
return self[key]
def __setattr__( self ,key ,value ):
if key in dir( self ):
return super( NewDict ,self ).__setattr__( key ,value )
self[key]=value
展开