Подсчет экземпляров класса?

Я очищаю некоторый код от модуля, который я расширяю, и я не могу найти способ Pythonify этого кода:

global_next_id = 1

class Obj:
  def __init__(self):
    global global_next_id
    self.id = global_next_id

    global_next_id += 1

Этот код использует глобальный идентификатор для отслеживания экземпляров класса (мне также нужна переменная self.id, и она должна быть числом).

Может кто-нибудь предложить способ Pythonify этого кода?

Ответ 1

Попробуйте что-то вроде этого:

from itertools import count

class Obj(object):
  _ids = count(0)

  def __init__(self):
    self.id = next(self._ids)

Ответ 2

Вот способ подсчета экземпляров без классов потомков, имеющих один и тот же идентификатор/счетчик. Метакласс используется для создания отдельного счетчика id для каждого класса.

Использует синтаксис Python 3 для метаклассов.

import itertools

class InstanceCounterMeta(type):
    """ Metaclass to make instance counter not share count with descendants
    """
    def __init__(cls, name, bases, attrs):
        super().__init__(name, bases, attrs)
        cls._ids = itertools.count(1)

class InstanceCounter(object, metaclass=InstanceCounterMeta):
    """ Mixin to add automatic ID generation
    """
    def __init__(self):
        self.id = next(self.__class__._ids)

Ответ 3

Генератор?

def get_next_id():
    curr_id = 1
    while True:
        yield curr_id
        curr_id += 1

Ответ 4

Это должно выполнить задание:

class Obj:
    _counter = 0
    def __init__(self):
        Obj._counter += 1
        self.id = Obj._counter