Question re class variable

alister alister.nospam.ware at ntlworld.com
Tue Sep 29 12:00:16 CEST 2015


On Tue, 29 Sep 2015 02:27:23 -0700, plewto wrote:

> I have a perplexing problem with Python 3 class variables. I wish to
> generate an unique ID each time an instance of GameClass is created.
> There are two versions of the __gen_id method with test run results for
> each listed below the code.
> 
> Originally I used the version which is now commented out. When a new
> instance was created it created an ID by appending the value of
> __instance_counter to the class name, it then checked the contents of of
> __instatance_registrty to see if this ID was already in use. If so it
> incremented the counter until it found an unused ID. This version works
> exactly as I expected.
> 
> Later I decided to get rid of __instance_registry and rely solely on the
> restricted access to __instance_counter and the fact that it is
> monotonically increasing to generate IDs. I wrote the second, simpler
> version of __gen_id to that end, but it doesn't work!  No doubt I'm
> overlooking something very simple here but I'm not seeing it.
> 
> Any help appreciated.
> 
> 
> class GameObject:
> 
>     # __instance_registry = {"":None}
>     __instance_counter = 0
>     
>     def __init__(self, name):
>         self.__name = str(name)
>         self.__id = self.__gen_id()
> 
>     # def __gen_id(self):
>     #     ty = self.__class__.__name__
>     #     id = ''
>     #     while id in self.__instance_registry:
>     #         id = '%s_%d' % (ty, self.__instance_counter)
>     #         self.__instance_counter += 1 #    
>     self.__instance_registry[id] = self #     return id
> 
>     def __gen_id(self):
>         ty = self.__class__.__name__
>         id = '%s_%d' % (ty, self.__instance_counter)
>         self.__instance_counter += 1 return id
> 
>     def __str__(self):
>         return "name = '%s'   id = '%s'" % (self.__name, self.__id)
>     
>     
> go1 = GameObject("GO1")
> go2 = GameObject("GO2")
> go3 = GameObject("GO3")
> print(go1)
> print(go2)
> print(go3)
> 
> 
> # Results with original __gen_id method # name = 'GO1'   id =
> 'GameObject_0'
> # name = 'GO2'   id = 'GameObject_1'
> # name = 'GO3'   id = 'GameObject_2'
> 
> 
> # Results with new simpler __gen_id method, __instance_counter not being
> incremented # name = 'GO1'   id = 'GameObject_0'
> # name = 'GO2'   id = 'GameObject_0'
> # name = 'GO3'   id = 'GameObject_0'

why reinvent the wheel?
why not simply use pythons builtin id function?
each new instance of an object is automatically assigned a unique ID


-- 
I'm a soldier, not a diplomat.  I can only tell the truth.
		-- Kirk, "Errand of Mercy", stardate 3198.9


More information about the Python-list mailing list