<p>或许可以用这样的方法:</p>
<pre><code>import collections
class UndoBuffer(object):
def __init__(self,value,max_length=5):
self.max_length=max_length
self._buffer=collections.deque([value],max_length)
@property
def data(self):
return self._buffer[-1]
@data.setter
def data(self,value):
self._buffer.append(value)
def restore(self,index):
self.data=self._buffer[index]
</code></pre>
<p>生成UndoBuffer对象</p>
^{pr2}$
<p>设置<code>data</code>属性会自动将值存储在<code>_buffer</code>中:</p>
<pre><code>print(rawdict._buffer)
# deque(['{1}'], maxlen=5)
print(rawdict.data)
# {1}
</code></pre>
<p>更改<code>rawdict.data</code>的值会将该值附加到<code>rawdict._buffer</code>:</p>
<pre><code>rawdict.data = '{2}'
print(rawdict._buffer)
# deque(['{1}', '{2}'], maxlen=5)
</code></pre>
<p>Buf如果您访问<code>rawdict.data</code>,则只获得最新的值:</p>
<pre><code>print(rawdict.data)
# {2}
</code></pre>
<p>再将值更改几次{1} '在缓冲区填充到其最大长度时被丢弃:</p>
<pre><code>rawdict.data = '{3}'
rawdict.data = '{4}'
rawdict.data = '{5}'
print(rawdict._buffer)
# deque(['{1}', '{2}', '{3}', '{4}', '{5}'], maxlen=5)
rawdict.data = '{6}'
print(rawdict._buffer)
# deque(['{2}', '{3}', '{4}', '{5}', '{6}'], maxlen=5)
</code></pre>
<p>从rawdict.\u缓冲区恢复值:</p>
<pre><code>rawdict.restore(0) # set rawdict.data to rawdict._buffer[0]
print(rawdict.data)
# {2}
print(rawdict._buffer)
# deque(['{3}', '{4}', '{5}', '{6}', '{2}'], maxlen=5)
</code></pre>