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