How To capture an id into an array..

Peter Otten __peter__ at web.de
Mon Mar 29 02:03:37 EST 2004


Josiah Carlson wrote:

> BALAJI RAMAN wrote:
>> Hello everybody!!!
>> 
>> I'm pretty much new to this OOP...
>> 
>> I have a problem..
>> 
>> Here is a part of code that I'm writing
>> 
>> class V(E):
>>     """ This is a variable for MPY"""
>>     def __init__(self):
>>         print id(self)
>>         check=[]
>>         check.append(id(self))
>>         self.val = None
>> 
>> what I do is call say v1=V() so it means that v1 belongs to the
>> variable class..
>> 
>> Again if I call v2=V() so now v2 also belong to this class.. I want
>> to keep a track of all the instances of this class.. and store their
>> ids in an array..
>> 
>> any help in this regards is appreciated...
> 
> The poor way of doing it is...
> 
> class V(E):
>      check = []
>      def __init__(self):
>          print id(self)
>          self.check.append(id(self))
>          self.val = None
> 
> The reason it is poor is because if an object is deleted, its id could
> be reused.
> 
> Instead, you should use weak references.  I've found the following to be
> useful on occasion...
> 
> import weakref
> 
> class V(E):
>      check = {}
>      def __init__(self):
>          #create a weak reference to yourself
>          #place it in the __olist
>          self.check[id(self)] = weakref.ref(self)
>      def __del__(self):
>          del self.check[id(self)]
>      def __repr__(self):
>          return str(id(self))
>      def get_olist(self):
>          #this creates a hard reference to every object
>          return [o() for o in self.check.values() if o() is not None]
> 
>   - Josiah

The __del__ method may not always be called. I find the WeakValueDictionary
handy (which internally uses callbacks I think).

import weakref 

class V:
    all = weakref.WeakValueDictionary() # required
    def __init__(self, name):
        self.name = name
        V.all[id(self)] = self # required
    def __str__(self):
        return self.name
    __repr__ = __str__

v1 = V("v1")
v2 = V("v2")
print V.all.values()
del v1
print V.all.values()

Peter





More information about the Python-list mailing list