這裏是你實現。請注意,您監視的對象必須是可哈希和可挑選的。還請注意,使用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
如果你測試它像這樣
object1 = MyObject()
monitor = Monitor()
print monitor.is_changed(object1)
object1.change_somehow()
print monitor.is_changed(object1)
print monitor.is_changed(object1)
它打印
False
True
False
不錯。與此同時,我自己以一種非常類似於您的方式實現了它。不同之處在於我使用了散列。你爲什麼使用泡菜?好點嗎? – 2009-10-15 20:19:59
我想你會發現,如果對象發生變化,哈希值可能不會改變,但醃菜絕對會。 – 2009-10-15 20:42:49
好的,謝謝你的提示,我會開始使用泡菜。 – 2009-10-15 21:05:35