# -*- 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. 用宏判断程序当前的运行模式(debug or release)

    例子 #if defined (DEBUG) && DEBUG == 1 // 如果当前处于debug 模式 //to do #else //to do #endif 

  2. 告别恶心的CGRect设置

    FrameAccessor https://github.com/AlexDenisov/FrameAccessor Manual Install(手动安装) All you need to do i ...

  3. Eclipse中运行Tomcat遇到的内存溢出错误

    使用Eclipse(版本Indigo 3.7)调试Java项目的时候,遇到了下面的错误: Exception in thread "main" Java.lang.OutOfMem ...

  4. js读取json方法

    json也是对象,可以直接使用对象调用 var json = {contry:{area:{man:"12万",women:"10万"}}}; json.con ...

  5. Rabbit MQ UI 重置 用户名 密码

    新增admin用户 rabbitmqctl add_user newadmin s0m3p4ssw0rd rabbitmqctl set_user_tags newadmin administrato ...

  6. 第九章 JVM调优推荐

    说明:本文主要参考自<分布式Java应用:基础与实践> 1.JVM的调优主要是内存的调优,主要调两个方面: 各个代的大小 垃圾收集器选择 2.各个代的大小 常用的调节参数 -Xmx -Xm ...

  7. Java---多线程断点下载

    在上一章中我们实现了多线程下载功能,这里我们添加断点下载功能,防止下载过程中程序意外退出.具体代码如下: package com.jwzhangjie; /** * 说明: * 每一个线程下载的位置计 ...

  8. mybatis 针对SQL Server 的 主键id生成策略

    SQL Server中命令: select newId()  ,可以得到SQL server数据库原生的UUID值,因此我们可以将这条指令写到 Mybatis的主键生成策略配置selectKey中. ...

  9. Kafka 配置说明

    参考地址:http://my.oschina.net/infiniteSpace/blog/312890?p=1 server.properties中所有配置参数说明(解释) broker.id =0 ...

  10. 转:好用 Eclipse插件收集与说明

    http://developer.51cto.com/art/201007/214478.htm