看了CodeBokk 第二版通过python实现缓存环,吸收之后记录下,方便以后查阅。
任务:
定义一个固定尺寸的缓存,当它填满的时候,新加入的元素会覆盖第一个(最老的)元素。这种数据结构在存储日志和历史信息时非常有用。
解决方案:
当缓存填满时,及时地修改缓存对象,使其从为填满的缓存类变成填满的缓存类。
实现代码如下:
1 class RingClass: 2 """ 3 定义一个未填满的缓存类 4 """ 5 def __init__(self, size_max): 6 self.size = size_max 7 self.data = [] 8 9 class __Full: 10 “”“ 11 定义一个填满缓存时处理 12 ”“” 13 def append(self, x): 14 self.data[self.cur] = x 15 self.cur = (self.cur+1) % self.size 16 17 def tolist(self): 18 return self.data[self.cur:]+self.data[:self.cur] 19 20 def append(self, x): 21 self.data.append(x) 22 if len(self.data) == self.size: 23 self.cur = 0 24 self.__class__ = self.__Full """永久性的将当前类切换填满的缓存类,关键部分""" 25 def tolist(self): 26 return self.data
用法示例代码如下:
1 if __name__ == "__main__": 2 x = RingBuff(5) 3 x.append(1);x.append(2);x.append(3);x.append(4) 4 print x.__class__,x.tolist() 5 x.append(5) 6 print x.__class__,x.tolist() 7 x.append(6) 8 print x.__class__, x.data, x.tolist() 9 x.append(7);x.append(8);x.append(9):x.append(10) 10 print x.__class__, x.data,x.tolist()
最后的结果示例如下:
由于缓存环有固定大小,当填满的时候,加入新元素会覆盖到它持有的最旧的元素,。通过self.__class__ = self.__Full 完成这个转变。在实际应用中还是很有用处的。记录下,方便以后查阅!