2011-12-25 2 views
10

Я чистил некоторый код из модуля я простирающийся, и я не могу найти способ 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

Почему вы должны «следить за экземплярами класса» с глобальным идентификатором? –

+1

Это для библиотеки PDF, которую я модифицирую. Каждый PDF 'Obj' должен быть распечатан с соответствующим идентификатором. – Blender

ответ

34

попробовать что-то вроде этого:

from itertools import count 

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

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

Я полностью забыл переменные класса ... Спасибо за решение 'itertools'! – Blender

+1

Жаль, что я не могу претендовать на единственный кредит - я видел его где-то здесь на другом посту. Это элегантно и эффективно. –

+0

Эх, это работает для меня. – Blender

1

генератор?

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

Вот способ подсчета экземпляров без классов потомков, имеющих один и тот же идентификатор/счетчик. Метакласс используется для создания отдельного счетчика 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) 
0

Это должно сделать работу:

class Obj: 
    _counter = 0 
    def __init__(self): 
     Obj._counter += 1 
     self.id = Obj._counter 
Смежные вопросы