监视对象更改的Python对象

Ram*_*hum 4 python hash

我想要一个Python对象,它将监视自上次签入以来其他对象是否已更改,可能是通过存储它们的哈希和比较.它的行为应该是这样的:

>>> library = Library()
>>> library.is_changed(object1)
False
>>> object1.change_somehow()
>>> library.is_changed(object1)
True
>>> library.is_changed(object1)
False
Run Code Online (Sandbox Code Playgroud)

你知道这样的事吗?

Nic*_*ood 7

这是给你的一个实现.请注意,您监视的对象必须是可清除和可选择的.另请注意,使用a WeakKeyDictionary表示Monitor不会阻止被监视对象被删除.

from weakref import WeakKeyDictionary
from cPickle import dumps

class Monitor():
    def __init__(self):
        self.objects = WeakKeyDictionary()
    def is_changed(self, obj):
        current_pickle = dumps(obj, -1)
        changed = False
        if obj in self.objects:
            changed = current_pickle != self.objects[obj]
        self.objects[obj] = current_pickle
        return changed

class MyObject():
    def __init__(self):
        self.i = 1
    def change_somehow(self):
        self.i += 1
Run Code Online (Sandbox Code Playgroud)

如果你这样测试它

object1 = MyObject()
monitor = Monitor()
print monitor.is_changed(object1)
object1.change_somehow()
print monitor.is_changed(object1)
print monitor.is_changed(object1)
Run Code Online (Sandbox Code Playgroud)

它打印

False
True
False
Run Code Online (Sandbox Code Playgroud)