# -*- coding: utf-8 -*-
#python 27
#xiaodeng
#对UserDict的研究 class UserDict():
def __init__(self, dict=None, **kwargs):
self.data = {} #定义self.data
if dict is not None:
self.update(dict)
if len(kwargs):
self.update(kwargs)
#print self.data #构造函数 def __repr__(self):#有该语句,a=UserDict(b),print a时,可打印实例内容
return repr(self.data) def __cmp__(self, dict):
if isinstance(dict, UserDict):
return cmp(self.data, dict.data)
else:
return cmp(self.data, dict)
__hash__ = None # Avoid Py3k warning def __len__(self):
'''
给类构造长度运算方式,当a=UserDict(b)实例化时,print len(a)才能有运算结果
没有__len__语句,会报错,
如:AttributeError: UserDict instance has no attribute '__len__'
提示说明:UserDict instance(UserDict实例)没有__len__属性
'''
return len(self.data) def __getitem__(self, key):
if key in self.data:
return self.data[key]
if hasattr(self.__class__, "__missing__"):
return self.__class__.__missing__(self, key)
raise KeyError(key) def __setitem__(self, key, item):
'''
#__setitem__,不需要返回值,所以没有return
#怎么调用?
#a['a']=5
'''
self.data[key] = item #__delitem__,不需要返回值,所以没有return
def __delitem__(self, key):
'调用方式:del a[key]'
del self.data[key] def clear(self): self.data.clear() def copy(self):
if self.__class__ is UserDict:
return UserDict(self.data.copy())
import copy
data = self.data
try:
self.data = {}
c = copy.copy(self)
finally:
self.data = data
c.update(self)
return c def keys(self):
'''
>>> a.keys() #key键
['age', 'name', 'laiYuan']
'''
return self.data.keys()#注意data不能省略 def items(self):
return self.data.items() def iteritems(self):
return self.data.iteritems() def iterkeys(self):
return self.data.iterkeys() def itervalues(self):
return self.data.itervalues() def values(self):
'''
>>> a.values()
[28, 'xiaodeng', 'hubei']
'''
return self.data.values()
def has_key(self, key): return key in self.data #更新操作
def update(self, dict=None, **kwargs):
if dict is None:
pass
elif isinstance(dict, UserDict):
self.data.update(dict.data)
elif isinstance(dict, type({})) or not hasattr(dict, 'items'):
self.data.update(dict)
else:
for k, v in dict.items():
self[k] = v
if len(kwargs):
self.data.update(kwargs) def get(self, key, failobj=None):
'''
failobj:预定义内容,
该段小代码的意思是key是否在self中,如果不存在,则返回failobj,如存在可返回其value值
print a.get('name')#failobj用预定义的值None
print a.get('YuYan','python')
'''
if key not in self:
return failobj
return self[key] def setdefault(self, key, failobj=None):
'与get有异曲同工之妙'
if key not in self:
self[key] = failobj
return self[key] def pop(self, key, *args):
return self.data.pop(key, *args) def popitem(self):
'删除并返回dict中任意的一个(key,value)队,如果字典为空会抛出KeyError'
'KeyError:popitem(): dictionary is empty'
return self.data.popitem() def __contains__(self, key):
return key in self.data
@classmethod
def fromkeys(cls, iterable, value=None):
d = cls()
for key in iterable:
d[key] = value
return d
if __name__=='__main__':
b={'name':'xiaodeng','age':28,'laiYuan':'hubei'}
a=UserDict(b)
print a
print len(a)
print a.get('name')
print a.get('bb','python')

对UserDict的研究的更多相关文章

  1. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  2. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  3. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  4. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  5. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  6. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  7. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  8. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  9. Oracle研究专题:Oracle系统安装与配置

    最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧. 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情. 想到过去几年,乃至接触IT行业开始就只有玩过sql ...

随机推荐

  1. 深入理解 Java中的 流 (Stream)

    首先,流是什么? 流是个抽象的概念.是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行.设备能够是文件,网络,内存等. 流具有方向性,至于是输入 ...

  2. Asp.Net中自以为是的Encode

    Asp.Net 引擎可能是不错,但是它把程序员想的太笨,会自以为是做很多自动的 Encode 和 Decode,以下文举例: 如果客户端我们 post 了如下的数据, 但是你实际得到的是: 也就是说, ...

  3. sscanf,sprintf用法

    #include<string.h> #include<stdio.h> int main() { ],sztime1[],sztime2[]; sscanf("12 ...

  4. JBoss 系列一 O O:Maven jBPM 6 集成演示样例

    概述 jBPM 6 中底层架构基于 Maven,所以我们能够非常easy的进行 Maven jBPM 6 集成演示样例,本文分三个部分: 基本原理介绍 Maven jBPM 6 集成 jBPM 6 中 ...

  5. 充满未来和科幻的界面设计FUI在国内还没有起步在国外早起相当成熟

    所谓FUI可以是幻想界面(Fantasy User Interfaces).科幻界面(Fictional User Interfaces).假界面(Fake User Interfaces).未来主义 ...

  6. Word Break leetcode java

    题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-se ...

  7. 【Ansible】Playbook实例

    Learn to build Ansible playbooks with our guide, one step at a time In our previous posts, we introd ...

  8. 【Docker】容器、虚拟机与Docker概念全解析

    导读 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.本文立足于新手,从容器和虚拟机两个大 ...

  9. 【7】AccessDB快速数据访问

    阅读目录 C#和VB数据访问的比较 AccessDB的设计 数据库的连接 三种主要操作 错误输出及调试 小结 回到顶部 C#和VB数据访问的比较 C#中要进行一次普通的数据库查询,需要创建连接,再根据 ...

  10. ElasticSearch关闭重启命令

    很多人学习elasticSearch都是自学,想百度一下如何重启es也是没有答案,我硬着头皮,算是琢磨出来了,借此写博,希望能帮助您. 1.如何关闭ES,elasticsearch关闭办法 1.使用h ...