From: Mike Bayer Date: Thu, 6 Apr 2006 14:27:03 +0000 (+0000) Subject: the ultimate "hands off" approach to the object's dictionary of managed attributes X-Git-Tag: rel_0_1_6~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=941d9caef865a0c70d14ba56d04041853ff4440d;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git the ultimate "hands off" approach to the object's dictionary of managed attributes --- diff --git a/lib/sqlalchemy/attributes.py b/lib/sqlalchemy/attributes.py index 6424c9d793..1a399159e7 100644 --- a/lib/sqlalchemy/attributes.py +++ b/lib/sqlalchemy/attributes.py @@ -78,9 +78,10 @@ class ManagedAttribute(object): which occurs through the SmartProperty property object ultimately calls upon ManagedAttribute objects associated with the instance via this dictionary.""" def __init__(self, obj, key): - self.__obj = weakref.ref(obj) + #self.__obj = weakref.ref(obj) + self.obj = obj self.key = key - obj = property(lambda s:s.__obj()) + #obj = property(lambda s:s.__obj()) def history(self, **kwargs): return self def plain_init(self, *args, **kwargs): @@ -493,6 +494,27 @@ class AttributeManager(object): the new object instance as an argument to create the new ManagedAttribute. Extra keyword arguments can be sent which will be passed along to newly created ManagedAttribute.""" - class_._attribute_manager = self + if not hasattr(class_, '_attribute_manager'): + class_._attribute_manager = self + class_._managed_attributes = ObjectAttributeGateway() setattr(class_, key, self.create_prop(class_, key, uselist, callable_, **kwargs)) +managed_attributes = weakref.WeakKeyDictionary() + +class ObjectAttributeGateway(object): + """handles the dictionary of ManagedAttributes for instances. this level of indirection + is to prevent circular references upon objects, as well as keeping them Pickle-compatible.""" + def __set__(self, obj, value): + managed_attributes[obj] = value + def __delete__(self, obj): + try: + del managed_attributes[obj] + except KeyError: + raise AttributeError() + def __get__(self, obj, owner): + if obj is None: + return self + try: + return managed_attributes[obj] + except KeyError: + raise AttributeError() \ No newline at end of file