话不多说直接上代码:
class ImmutableDict(object):
def __init__(self,**dic):
self.key = []
self.value = []
for key in dic:
self.key.append(key)
self.value.append(dic[key])
self.__index = 0
def __len__(self): #这个方法返回容器的长度,对于可变不可变容器都需要有的协议的一部分
print(len(self.key))
return len(self.key)
def __getitem__(self, item): #定义访问元素时,就会返回对应的值
try:
__index = self.key.index(item)
print(str(self.value[__index]))
return self.value[__index]
except ValueError:
raise KeyError('can not find the key')
def get(self,item):
try:
__index = self.key.index(item)
print(str(self.value[__index]))
return self.value[__index]
except ValueError:
raise KeyError('can not find the key')
def __setitem__(self, key, value): #定义当一个条目被赋值时的行为
if key not in self.key:
self.key.append(key)
self.value.append(value)
else:
raise TypeError("'ImmutableDict' object are immutable")
def __delitem__(self, key): #定义一个条目被删除时的行为,比如del self[key]这只是可变容器的一部分,
try:
__index = self.key.index(key)
del self.key[__index]
del self.value[__index]
except ValueError:
raise KeyError("'ImmutableDict' object are immutable")
def __str__(self): #这个是实例化对象后打印出来的
result_dict = {}
for index in range(len(self.key)):
__key = self.key[index]
__value = self.value[index]
result_dict[__key] = __value
return str(result_dict)
def __iter__(self): #返回一个容器的迭代器
return iter(self.value)
def next(self):
if self.__index == len(self.key):
self.__index = 0
raise StopIteration()
else:
__key = self.key[self.__index]
__value = self.value[self.__index]
result = __key, __value
self.__index += 1
return result
def __reversed__(self): #反转时使用的
__result = self.value[:]
__result.reverse()
return __result
def __contains__(self, item):
if item in self.value:
return True
else:
return False
def pop(self,item): #定义不可以pop字典
raise TypeError("'ImmutableDict' object are immutable")
d = ImmutableDict(Connection=’kee’,Host=’test.com’)
实例化使用时和字典没什么区别,但是删除内容时就会报TypeError的错误
修改键值的时候也会报错