471,072 Members | 1,453 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,072 software developers and data experts.

Recursion with __setattr__

Operating Ubunutu Linux 5.04 on iMac 333mhz
Python 2.4.1 in IDLE 1.1.1

In trying to create a interactive drawing framework in Python I came across
the idea of binding attributes of one object to attributes of another.

The way it works is when obj1.attr1 is set obj2.attr2 should have it's
__setattr__ method called as well. But it ends up giving me a recursion error.

The attribute synchronization is shown below:

#file: sync.py

def sync(attr1,obj1,obj2,attr2=None):
"""Synchronize attribute access

name of attribute to synchronize
(optional) attribute name to use when setting second object.
if not attr2: attr2 = attr1
# rename old __setattr__'s
obj1.__old_setattr__ = obj1.__setattr__
obj2.__old_setattr__ = obj2.__setattr__
except AttributeError: pass
# modify mirrored attributes on attribute change
def hook_setattr(inst):
# Hey! Only classes have special methods!
class sethook(inst.__class__):
def __setattr__(self,name,value):
except AttributeError: pass
if name in self.__syncdict__:
entry = self.__syncdict__[name]
for mirror,attr in entry: pass
# recursion error here: setattr(mirror,attr,value)
#sethook.__name__ = inst.__class__.__name__ # magic?
inst.__class__ = sethook
# append synchronization info
except AttributeError:
obj1.__syncdict__ = {attr1: [(obj2,attr2)]}
except AttributeError:
obj2.__syncdict__ = {attr2: [(obj1,attr1)]}
# make the magic work

When I try to call this like sync('attr',obj,obj2) I get a recursion error.
I could understand this happening if I was calling setattr on itself, but
why the other object?

Any help is greatly appreciated. Also, any pointers on efficiency or easier
ways is also welcome. Thanks in

Oct 16 '05 #1
0 1372

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by George Sakkis | last post: by
reply views Thread by Nathan Harmston | last post: by
12 posts views Thread by Joshua Kugler | last post: by
reply views Thread by Terry Reedy | last post: by
2 posts views Thread by Stef Mientki | last post: by
2 posts views Thread by mwojc | last post: by
2 posts views Thread by Jan Schilleman | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.