python面向对象-类的__setitem__,__getitem__,__len__,__delitem__方法

介绍

python中除了可以使用内建序列(list,tuple,dict),还可以自定义序列,但需要在定义类的时候对一些方法进行实现。

在本文,实现 有序 的 dict,存储结构与 dict 相同,也是 key-value,但遍历时的顺序,与放入 key-value 的顺序一致

定义类

#coding=utf-8

class MyDict:
    def __init__(self):
        #定义存放key的list
        self.__keys=[]
        #定义存放value的list
        self.__values=[]

#创建实例
md=MyDict()

通过__setitem__()实现增加key-value

增加key-value是通过下面的代码,

md['version']="1.0"

但直接运行报错,为了让上面的代码正确运行,需要在类中实现
__setitem__()方法

def __setitem__(self,key,value):
        #如果key存在就更新对应的value值,如果不存在就追加到尾部
        if key in self.__keys:
            pos=self.__keys.index(key)
            self.__values[pos]=value
        else:
            self.__keys.append(key)
            self.__values.append(value)

调用:

md['version']="1.0"
md['version']="1.1"

限制key的类型

在python中,dict的key的类型必须是不可变数据类型,如:str,int,tuple,我们也要对key做限制,只允许key是str,int
需要判断key的类型,用到isinstance()函数,详见链接:http://www.runoob.com/python/python-func-isinstance.html

__setitem__() 方法的代码优化为:

    def __setitem__(self, key, value):
        #判断key的类型 isinstance()
        if type(key)==str or type(key)==int:
            if key in self.keys:
                #找到key在keys中的位置
                index=self.keys.index(key)
                #做更新values相对应的值
                self.values[index]=value
            else:
                self.keys.append(key)
                self.values.append(value)
        else:
            #代替异常
            print("添加错误")

通过 __getitem__() 实现 根据key访问value

在dict中是通过下面代码实现的:

v=md['version']
print(v)

但直接运行报错,为了实现上面功能,需要在类中实现__getitem__()方法,在类中实现下面代码

def __getitem__(self,key):
        '''如果存在key,就返回对应的value值,如果不存在就返回None'''
        if key in self.__keys:
            pos=self.__keys.index(key)
            return self.__values[pos]
        else:
            return None

调用:

print(md['version'])

通过 __len__() 实现 获取序列长度

在dict中,是通过下面代码实现

len(md)

但直接运行报错,为了实现上面功能,需要在类中实现
__len__()方法:

def __len__(self):
    return len(self.__keys)

调用:

print(len(md))

通过 delitem 实现删除key-value

在dict中通过如下代码实现:

del md['version']

但直接运行报错,为了实现上面功能,需要在类中实现__delitem__()方法:

def __delitem__(self,key):
    '''如果存在key,就移除key和对应的value'''
    if key in self.__keys:
        pos=self.__keys.index(key)
        del self.__keys[pos]
        del self.__values[pos]

测试:

del md['version']
print(len(md))

执行结果:

0

完整代码

#coding=utf-8

class MyDict:
    def __init__(self):
        #定义存放key的list
        self.__keys=[]
        #定义存放value的list
        self.__values=[]

    def __setitem__(self, key, value):
        #判断key的类型 isinstance()
        if type(key)==str or type(key)==int:
            if key in self.keys:
                #找到key在keys中的位置
                index=self.keys.index(key)
                #做更新values相对应的值
                self.values[index]=value
            else:
                self.keys.append(key)
                self.values.append(value)
        else:
            #代替异常
            print("添加错误")

    def __getitem__(self,key):
        '''如果存在key,就返回对应的value值,如果不存在就返回None'''
        if key in self.__keys:
            pos=self.__keys.index(key)
            return self.__values[pos]
        else:
            return None

    def __len__(self):
        return len(self.__keys)

    def __delitem__(self,key):
        '''如果存在key,就移除'''
        if key in self.__keys:
            pos=self.__keys.index(key)
            del self.__keys[pos]
            del self.__values[pos]

md=MyDict()
md['version']="1.0"
md['version']="1.1"
md['cpu']="麒麟980"
print(md['version'])
print(len(md))
del md['version']
print(len(md))
print(md['cpu'])
#访问不存在的key
print(md['aaa'])

实现for…in语句迭代

该类还不能支持for...in语句,为了支持该语句,还需要实现迭代器,情况下面链接
http://www.malaoshi.top/user/article_edit_editormd.jsp?id=1EF2D9P4Udhf


原文出处:/show_1EF2D1rBVOx0.html