stef a écrit : > thanks Guys for your information, > > indeed you're all quit right, > but I think I've not correctly described my problem :-( > > I need to have 2 (or more) names, that references the same instance of > an object, > and in assigning a value to the object (or to some property in the object), > I need to do extra activities (like changing some global variables).
Then you want a property (aka computed attribute). > Now if I use a "container type object", without actual using the index > of the container object, > I get things working OK. > But now I have to use a dummy index, if I use the object in assignments, > see program below. > Is there another way, without using the dummy index, to achieve the same > results ? > thanks, > Stef Mientki > > <Python> > class cpu_ports(object): > def __init__(self, value=0): > self._d = value > def __setitem__(self, index, value): > print 'vv' > self._d = value > def __getitem__(self, index): > return self._d > def __repr__(self): > return str(self._d) > > name1 = cpu_ports() # create an instance > name2 = name1 # refer with a second name to the same instance > print name1, name2 # test ok > > name1[0] = 25 # assign a value to the instance > print name1, name2 # both references are OK > > name2[0] = 26 # assign another value through the other name > print name1, name2 # both reference are OK > > name2[0] = name1[0] + 13 # use both names at either side of an assignment > print name1, name2 # both references still OK You can have something working the same way using a property, but that's how far you'll get - if you hoped to be able to automagically rebind name2 when rebinding name1, then too bad, because python wont let you do so. You have to understand that name = obj is totally different from name.attr = obj or name[index] = obj In the first case, this is *really* a binding, and that's one of the few things that Python won't let you mess with. In the two last cases, it's in fact a method call - as the use of __[get|set]item__ should make obvious. here's an example using a property: class cpu_ports(object): def __init__(self, value=0): self._d = value @apply def value(): def fset(self, value): print 'vv' self._d = value def fget(self): return self._d return property(**locals()) def __repr__(self): return str(self._d) name1 = cpu_ports() # create an instance name2 = name1 # refer with a second name to the same instance print name1, name2 # test ok name1.value = 25 # assign a value to the instance print name1, name2 # both references are OK name2.value = 26 # assign another value through the other name print name1, name2 # both reference are OK name2.value = name1.value + 13 print name1, name2 # both reference are OK And that's about as far as you can go (without rewriting Python I mean). -- http://mail.python.org/mailman/listinfo/python-list