类实例的自动递增ID


问题内容

免责声明
:这是我目前正在研究的一个学期项目。我的问题是有关实现级别的详细信息,而不是评分方案的一部分。我只是在编写此代码,作为测试我将要写的论文的理论的一种方式。

另外,我很幸运地考虑了该问题的答案,因此请不要将此视为该问题的重复

问题

我有一张图(G =(V,E))。在算法的某个时刻,我需要通过将多个节点(例如v_1, v_2, ..., v_n)“折叠”到一个节点(例如v),将其转变为超图(某种意义上)。在该问题的上下文中,这意味着我需要改变边缘中E使得任何边缘e的任何之间v_1, v_2, v_n和任何其他节点uV将被改变,使得e现在是间uv

为了捕获现在在任意一对节点之间可能存在多个不同的边缘,我需要为每个边缘创建一个唯一的标识符。我试图通过ID和ID来执行此操作,但目前无法正确实现。

这是我尝试过的

class Edge:
    _ID = 0
    def __init__(self, u, v, w, c,f=0):
        self.id = Edge._ID 
        Edge._ID += 1
        self.src = u
        self.dest = v
        self.weight = w
        self.capacity = c
        self.flow = f

但是,当我尝试实例化新边缘时,出现以下错误:

>>> e = Edge(1,3,5,10,0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "UnsplittableFlow.py", line 14, in __init__
    self.id = Edge._ID; Edge._ID += 1
UnboundLocalError: local variable '_ID' referenced before assignment

编辑

有了一些答案的建议,我已经能够修复实例化时间错误。但是,另一个错误仍然存​​在。这是我的代码和错误:

class Edge:
    _ID = 0
    def __init__(self, u, v, w, c,f=0):
        self.id = self._ID; self._ID += 1
        self.src = u
        self.dest = v
        self.weight = w
        self.capacity = c
        self.flow = f

错误:

>>> e = Edge(1,3,5,10,0)
>>> e.id
0
>>> Edge._ID
0

>>> f = Edge(2,3,5,10,0)
>>> f.id
0
>>> Edge._ID
0

我将不胜感激

谢谢


问题答案:

您仍然可以使用self获得的_ID

self.id = self._ID 
self.__class__._ID += 1

如果您使用的是CPython,则可以拥有一个懒人的ID:

class Edge(object):
    @property
    def id(self): return id(self)