réponse de la myyn est bon - je pense l'objet de classe est un endroit parfait pour ranger le comptoir. Cependant, notez que, tel qu'il est écrit, il n'est pas sûr pour les threads. enveloppez donc dans un classmethod qui utilise un verrou:
import threading
class CounterExample(object):
_next_id = 0
_id_lock = threading.RLock()
@classmethod
def _new_id(cls):
with cls._id_lock:
new_id = cls._next_id
cls._next_id += 1
return new_id
def __init__(self):
self.id = self._new_id()
def test():
def make_some(n=1000):
for i in range(n):
c = CounterExample()
print "Thread %s; %s has id %i" % (threading.current_thread(), c, c.id)
for i in range(10):
newthread = threading.Thread(target=make_some)
newthread.start()
test()
Cela va 10 fils de discussion créant 1000 cas chacun. Si vous l'exécutez sans le code de verrouillage, vous risquez de vous retrouver avec le dernier identifiant inférieur à 9999, ce qui indique la condition de concurrence.
Vous pouvez également mettre 'self.identifier = CounterExample.instances_created' dans le corps de' __init__', car mellort semble vouloir avoir chaque objet avec un identifiant unique. (Cela signifierait, à son tour, que vous ne voudriez pas décrémenter 'instances_created' pendant la suppression, car cela pourrait potentiellement aboutir à des objets initialisés ayant des identifiants non-uniques plus tard.) – JAB
Cela fonctionne bien jusqu'à ce que vous essayiez de le faire avec classe interne, à quel point il échoue avec "CounterExample n'est pas défini". Y a-t-il autre chose que vous devez faire pour le faire fonctionner avec une classe interne? – Zxaos