类实例的自动递增 ID

ins*_*get 3 python uniqueidentifier class-instance-variables

免责声明:这是我目前正在进行的一个学期项目。我的问题是关于实施级别的细节,不属于评分方案的一部分。我编写这段代码只是为了测试我为即将撰写的论文提出的理论。

另外,我考虑过这个问题的答案,但运气不佳,所以请不要将其视为该问题的重复

问题

我有一个图(G=(V,E))。在我的算法中的某个时刻,我需要通过将多个节点(例如,)“折叠”为一个节点v_1, v_2, ..., v_n(例如,)来将其转换为超图(在某种意义上v)。在问题的上下文中,这意味着我需要更改 中 的边E,以便更改中e中的任何节点和中 中v_1, v_2, v_n的任何其他节点之间的任何边,这样现在位于和 之间。uVeuv

为了捕获任意一对节点之间现在可能存在多个不同的边,我需要为每个边创建一个唯一的标识符。我尝试通过 和 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
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

编辑

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

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
Run Code Online (Sandbox Code Playgroud)

错误:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助

谢谢

srg*_*erg 5

您编辑的代码被视为_ID实例变量,而不是类变量。根据马特·乔伊纳的回答,我认为您的意思是:

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

当我使用 的定义运行您的示例时Edge,我得到:

>>> e = Edge(1,3,5,10,0)
>>> e.id
0
>>> Edge._ID
1
>>> f = Edge(2,3,5,10,0)
>>> f.id
1
>>> Edge._ID
2
Run Code Online (Sandbox Code Playgroud)

这就是想要的结果。然而,其他人指出你的原始代码对他们有用,就像这段代码对我有用一样,所以我怀疑真正的问题是在你的代码中的其他地方。