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 -- https://mail.python.org/mailman/listinfo/python-list