对UserDict的研究

摘要:
#-*-编码:utf-8-*-#python27#xiaodeng#UserDict类UserDict()研究:def__init__(self,dict=None,**kwargs):self。data={}#定义自身。dataifdictsnotOne:self。update(dict)iflen(kwargs):self。update(kwargs)#打印
# -*- 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的研究》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高效率的排列组合算法《编程珠矶》python实现【原】结构体包含CString类型成员变量出错的原理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Android 上的 10 款 Web 开发工具推荐

作为一个狂热的Android用户,我一直在寻找适合Web开发人员使用的一些应用程序。以下推荐10款非常实用的Android端的Web开发工具。EditorJoooid1.1Editor这款工具非常适合用来发布包含HTML、文本、图片和相册的文章,还包含了GPL定位信息。...

MeteoInfo-Java解析与绘图教程(一)

MeteoInfo-Java解析与绘图教程(一)已经进入开发行业很多年了,这两年一直从事气象开发行业,为此对气象绘图有了新的见解像色斑图与卫星图一直都有python去绘制,在偶然的情况下,我接触到了meteoInfo,在对其使用过程中,也可以做到用java绘制格点散点图,色斑图,等值图,卫星图,风场图所以趁这个机会我开始记录自己的探索过程,方便你我他对于绘图...

华为交换机堆叠配置

请参考华为交换机的配置堆栈。[Leaf1-stack-port0/1]portinterfaceg0/0/12启用物理接口12加入堆栈组[Leaf1]stackslot0priority255修改优先级255,默认值为100警告:不要频繁修改优先级,因为它会使堆栈分裂。持续...

说说接口封装

今天,我为同事封装了一个接口。当谈到接口封装时,有很多关于它的讨论。在很多情况下,说一个服务好,一个服务坏,实际上是在吐槽服务团队之外暴露的界面质量。无论哪种语言,抽象的封装接口都由一个函数名、几个参数和几个返回值组成。总之,参数不应该被封装……我们在内部尝试接口_Catch不会抛出异常,所有信息都将以错误代码的形式返回。就php而言,建议进行异常处理。...

【问题】如何批量导出AI文件里内嵌的图片

截止目前为止,新版的AI里面没有直接可以批量导出内嵌图片的选项,手动一个个导出实在太麻烦了。有人说用Phantasm插件可以导出,但新版的找不到对应支持的插件版本,所以这里就不说了。这里介绍一种简单粗暴的方法。...

ArcGIS Server服务状态正在停止。。。问题BUG解决

1、 ArcGISServer服务器存在服务问题:ArcGISServerManager的所有服务都显示为“正在停止…”。N个解决方案1)港口占用问题。端口4000-4002已被其他程序占用,导致服务无法正常启动。您可以通过CMD找到相关PID占用的端口,停止它,然后启动GIS服务。您也可以在安装目录中将其手动更改为D:ProgramFiles ArcGIS...