python定义一个字典类型_Python 2.7 如何自定义一个CLASS风格的字典类型?

假设满足我这个要求的对象是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

展开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值