Python Cookbook-6.12 检查一个实例的状态变化
任务
一个实例在上次“保存”操作之后又被修改了,需要检查它的状态变化以便有选择地保存此实例。
解决方案
一个有效的方案是 mixin 类,这个类可以从多个类继承并能对一个实例的状态进行快照操作,这样就可以用此实例的当前状态和上次的快照做比较,来判断它是否被修改过了:
import copy
class ChangeCheckerMixin(object):containerItems = {dict: dict.iteritems, list: enumerate)immutable = Falsedef snapshot(self):'''创建self状态的“快照”--就像浅拷贝,但只对容器的类型递归(而不是对整个实例:在需要时实例会自行记录自己的状态变化)'''if self.immutable:returnself._snapshot = self._copy_container(self.__dict__)def makeImmutable(self):'''实例状态无法被修改 设置.immutable'''self.immutable = Truetry:del self._snapshotexcept AttributeError:passdef _copy_container(self,container):'''半浅拷贝,只对容器类型递归'''new_container = copy.copy(container)for k,v in self.containerItems[type(new_container)