免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7600 | 回复: 13
打印 上一主题 下一主题

如何像访问属性一样访问字典元素?? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-17 11:33 |只看该作者 |倒序浏览
有没有现成的库可以完成这样的操作:
有一个字典,这样访问其中的元素student['age'], 有现有的库可以自动的把这个字典生成一个东西,然后可以这样访问:student.age
谢谢。

论坛徽章:
0
2 [报告]
发表于 2010-08-17 12:09 |只看该作者
  1. def test(d):
  2.         class tmp:
  3.                 pass
  4.         newd=tmp()
  5.         for i in d:
  6.                 exec('newd.%s = d[i]' % i)
  7.         return newd

复制代码
这样应该能凑合。。。。。。
不知道有没有库。。。

论坛徽章:
0
3 [报告]
发表于 2010-08-17 13:26 |只看该作者
本帖最后由 luffy.deng 于 2010-08-17 13:40 编辑

回复 1# tianshizhiluan
这种任务你只要把语言本身搞清楚就可以完成。没什么必要库啊库的。比如定制一个字典

  1. class mydict(dict):
  2.     def __getattr__(self,i):
  3.         if i in self:
  4.             return self[i]
  5. a=mydict()
  6. a['a']=1
  7. print a.a
  8. print a.b
复制代码
对于一个已有的字典  也有很多办法  比如:
  1. d={'a':1,'b':2}
  2. class A(object):
  3.     pass
  4. a=A()
  5. for k,v in d.items():
  6.     setattr(a,k,v)   
  7. print a.a,a.b
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-08-17 14:08 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2010-08-18 14:43 |只看该作者
  1. class mydict(dict):
  2.     __getattr__=dict.__getitem__
  3.     def __setattr__(self, key, val):
  4.         dict.__setitem__(self, key, val)
  5.     def __delattr__(self, key):
  6.         dict.__delitem__(self, key)
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2010-08-20 17:58 |只看该作者
看这个,支持递归的调用,例如:
foo = {
    'a': 1,
    'b': 2,
    'c': {
        'a': 22,
        },
    }

x = common.DictObj()
x.foo = foo
x['age'] = 100
print x.foo.c.a # output 22                                                                                                                                                            
print x.age #output 100
  1. import types


  2. __all__ = ["DictObj"]


  3. class DictObj(types.DictType):
  4.     def __init__(self):
  5.         types.DictType.__init__(self)

  6.         
  7.     def __getitem__(self, key):
  8.         return self.__dict__[key]
  9.         
  10.     def __repr__(self):
  11.         return str(self.__dict__)

  12.    
  13.     def __setattr__(self, key, value):
  14.         x = {}
  15.         y = DictObj()

  16.         
  17.         if hasattr(value, "__dict__"):
  18.             x = vars(value)
  19.         elif isinstance(value, types.DictType):
  20.             x = value

  21.         else:
  22.             x = value


  23.         if isinstance(x, types.DictType):
  24.             for k in x.keys():
  25.                 setattr(y, k, x[k])
  26.         else:
  27.             y = x

  28.         print key, y
  29.         self.__dict__[key] = y

  30.    
  31.     def __setitem__(self, key, value):
  32.         if hasattr(value, "__dict__"):
  33.             v = DictObj(value)
  34.         else:
  35.             v = value
  36.             
  37.         setattr(self, key, v)
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-08-20 19:27 |只看该作者
回复 6# tianshizhiluan
对于一个已存在的字典办法很多,甚至都不需要实例动态添加属性的能力。
  1. d={'a':1,'b':2}
  2. k=type('klass',(object,),d)
  3. print k.a,k.b
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2010-08-21 21:20 |只看该作者
回复 7# luffy.deng


    哥们说的是递归!!回帖前请看贴

论坛徽章:
0
9 [报告]
发表于 2010-08-22 10:49 |只看该作者
本帖最后由 luffy.deng 于 2010-08-22 11:00 编辑
回复  luffy.deng

    哥们说的是递归!!回帖前请看贴
tianshizhiluan 发表于 2010-08-21 21:20

还挺有脾气 , 帖我看的很清!!递归怎么了!



  1. foo = {'a': 1,
  2.        'b': 2,
  3.        'c': {'a': 22
  4.            }
  5.        }
  6. class Obj(object):
  7.     def __getattribute__(self,name):
  8.         if isinstance(object.__getattribute__(self, name),dict):
  9.             setattr(self,name,type(name,(type(self),),
  10.                                    object.__getattribute__(self, name))())
  11.         return object.__getattribute__(self, name)

  12. Foo= type('Foo',(Obj,),foo)()
  13. print Foo.c.a
复制代码

论坛徽章:
0
10 [报告]
发表于 2010-08-22 12:13 |只看该作者
~~~~~~~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP