看了CodeBokk 第二版經過python實現緩存環,吸取以後記錄下,方便之後查閱。python
任務:緩存
定義一個固定尺寸的緩存,當它填滿的時候,新加入的元素會覆蓋第一個(最老的)元素。這種數據結構在存儲日誌和歷史信息時很是有用。數據結構
解決方案:app
當緩存填滿時,及時地修改緩存對象,使其從爲填滿的緩存類變成填滿的緩存類。spa
實現代碼以下:日誌
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
用法示例代碼以下:code
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 完成這個轉變。在實際應用中仍是頗有用處的。記錄下,方便之後查閱!blog