Recursion with __setattr__

C

Chris Young

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

attr1:
name of attribute to synchronize
attr2:
(optional) attribute name to use when setting second object.
"""
if not attr2: attr2 = attr1
# rename old __setattr__'s
try:
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):
try:
self.__old_setattr__(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
try:
obj1.__syncdict__[attr1].append(obj2,attr2)
except AttributeError:
obj1.__syncdict__ = {attr1: [(obj2,attr2)]}
try:
obj2.__syncdict__[attr2].append(obj1,attr1)
except AttributeError:
obj2.__syncdict__ = {attr2: [(obj1,attr1)]}
# make the magic work
hook_setattr(obj1)
hook_setattr(obj2)

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
advance.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top