Can I reference 1 instance of an object by more names ? rephrase
Bruno Desthuilliers
bruno.42.desthuilliers at wtf.websiteburo.oops.com
Wed May 23 07:42:42 EDT 2007
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).
More information about the Python-list
mailing list