2011-12-25 54 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 

該代碼使用全局ID來跟蹤實例(我在內部也需要變量self.id,它需要是一個數字)。

任何人都可以提出一種方法來Pythonify這段代碼嗎?

+1

爲什麼你需要「跟蹤類的實例的」具有全球ID? – 2011-12-25 04:46:47

+1

這是我正在修改的PDF庫。每個PDF'Obj'都需要打印出各自的ID。 – Blender 2011-12-25 06:45:10

回答

34

嘗試這樣:

from itertools import count 

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

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

我完全忽略了類的變量......感謝'itertools'解決方案! – Blender 2011-12-25 04:03:03

+1

我希望我可以聲稱自己的信用 - 我在另一篇文章的某處看到它。它的優雅和高效。 – 2011-12-25 04:09:47

+0

呃,它適合我。 – Blender 2011-12-25 04:17:41

1

發電機?

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

這裏是一個方法來計數沒有後代類共享相同的ID /計數的實例。元類用於爲每個類創建一個單獨的id計數器。

Metaclasses使用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

這應該做的工作:

​​