介绍
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