Ответ 1
Попробуйте что-то вроде этого:
from itertools import count
class Obj(object):
_ids = count(0)
def __init__(self):
self.id = next(self._ids)
Я очищаю некоторый код от модуля, который я расширяю, и я не могу найти способ 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 этого кода?
Попробуйте что-то вроде этого:
from itertools import count
class Obj(object):
_ids = count(0)
def __init__(self):
self.id = next(self._ids)
Вот способ подсчета экземпляров без классов потомков, имеющих один и тот же идентификатор/счетчик. Метакласс используется для создания отдельного счетчика 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)
Генератор?
def get_next_id():
curr_id = 1
while True:
yield curr_id
curr_id += 1
Это должно выполнить задание:
class Obj:
_counter = 0
def __init__(self):
Obj._counter += 1
self.id = Obj._counter