Python __getitem__语句执行及转存方法求助,python__getitem_,#import cPic
Python __getitem__语句执行及转存方法求助,python__getitem_,#import cPic
#import cPickle#dump_data = ""#def dump(data):# global dump_data# dump_data = cPickle.dumps(data)class A: __data = {} def __getitem__(self, item): return self.__data[item] def __setitem__(self, item, value): self.__data[item] = value #dump(self._data)a = A()a["foo"] = {}#print dump_dataa["foo"]["bar"] = 123#print dump_dataprint a._A__data # {'foo': {'bar': 123}}
目前这样是没有问题的,因为dict是所谓的mutable,__getitem__返回的是__data["foo"]的引用,而不是重新构造一个字典对象(传值)。
但是发生\一种这样的需求:每一次的get/set,但凡发生对__data的修改,都执行一个操作,比如转存到数据库,转存的文件,从网络中发送,等等,总之存取起来不是那么方便,这里用一个dump()来概括。现在去掉被注释的几行代码,问题就发生了:a["foo"]["bar"] = 123时将不会触发dump()。
当然我是不愿意改变方式的,谁会愿意用temp = a["foo"]; temp["bar"] = 123; a["foo"]=temp这种接口呢...
因为你a["foo"]之后就跟你的A没关系了,也就和你的dump没关系了,a["foo"]["bar"]=xx的时候就没法dump了。
给你的A设置一个同意的dump,然后自己修改了数据之后手动的a.dump(),一下吧。
莫非LZ要的是这种变态代码:
import typesdata = {}def dump(): print 'dump: %s'%dataclass A: def __init__(self, d={}): self.data = d # wrap all dictionary values for k,v in self.data.items(): if type(v) == types.DictType: self.data[k] = A(v) def __getitem__(self, name): return self.data[name] def __setitem__(self, name, value): if type(value) == types.DictType: # if dictionary, wrap it self.data[name] = A(value) else: self.data[name] = value dump() def __repr__(self): return repr(self.data)a = A(data)a["foo"] = {}a["foo"]["bar"] = 123a['User1'] = { "name":"robin", "age":10,}a["User1"]["info"]={}a["User1"]["info"]["address"] = "A block"a["User1"]["info"]["mobile"] = "110"a["deepdic"] = { 1:{ 2:{ 3:{ 4:{ 5:{ 6:{ 7:{ } } } } } } }}a["deepdic"][1][2][3][4][5][6][7]["a"] = "AAA"a["deepdic"][1][2][3][4][5][6][7]["b"] = "BBB"
dump(self._data) 放在getitem下面
编橙之家文章,
相关内容
- Python怎么实现跳板机连接线内部网络Mysql服务器的原理
- 请问树莓派一定需要安装Python-dev包蚂,树莓python-dev,我
- 请问python中opeio.open\codecs.open三者之间作用分别是什么,
- 怎么判断某个开源python项目是否适合自己,判断开源
- pandas内存错误MemoryError如何解决,pandasmemoryerror, File "
- Python爬虫返回unicode字符串如何得到汉字呢,pythonunico
- web开发和部署用pyenv还是virtualenv,pyenvvirtualenv,两种环境
- Python正则过滤特殊字符及乱码符怎么写,python特殊字符
- mac键盘上哪个键是python交互模式下快捷键C+underscore的
- python什么方法可以判断捉取的内容是否有更新,python
评论关闭