Bruno Desthuilliers wrote: > 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). thanks Bruno for your clear explanation, I was "afraid" that this would be the only solution, and now I'm sure, I can implement it in this way (which is not really a problem).
I just found a Python compiler for PICs (Pyastra), I still have to study it, but it might be a good idea, to translate JAL to Python, using the exact syntax of Pyastra. thanks again, Stef Mientki -- http://mail.python.org/mailman/listinfo/python-list