[ZODB-Dev] Dynamic Wrapper?
    Chris Spencer 
    gmane.20.evilspam at spamgourmet.com
       
    Thu Dec 15 20:12:54 EST 2005
    
    
  
Instead of requiring all persistable objects to inherit a special class, 
wouldn't it be possible to dynamically wrap a class's __setattr__ and/or 
__setitem__ methods to determine when an object's been modified? 
Something like:
class Monitor(object):
     class Proxy(object):
         def __init__(self, obj):
             self.obj = obj
         def __hash__(self):
             return id(self.obj)
         def __cmp__(self, p):
             return cmp(id(self.obj),id(p.obj))
     def __init__(self):
         self.modified = set()
     def add(self, obj):
         def newSetter(func):
             def registerChanges(theirself, *args, **kwargs):
                 self.modified.add(self.Proxy(theirself))
                 return func(theirself, *args, **kwargs)
             return registerChanges
         if hasattr(obj, '__setattr__'):
             obj.__class__.__setattr__ = 
newSetter(obj.__class__.__setattr__)
         if hasattr(obj, '__setitem__'):
             obj.__class__.__setitem__ = 
newSetter(obj.__class__.__setitem__)
m = Monitor()
from UserDict import UserDict
d = UserDict()
m.add(d)
d[123] = 'abc'
print m.modified
 >>> set([<__main__.Proxy object at 0xb7f28acc>])
I understand this has some drawbacks. Namely, it will only work for 
new-style classes, but for a large code base this might be easier than 
manually writing _p_changed = 1 everywhere.
Chris
    
    
More information about the ZODB-Dev
mailing list