类实例的自增 ID

3 投票
4 回答
4113 浏览
提问于 2025-04-17 07:21

免责声明: 这是我目前正在进行的一个学期项目。我有一个问题是关于实现细节的,这个问题与评分无关。我写这段代码只是为了测试我将在论文中提出的理论。

另外,我考虑过对这个问题的回答,但没有什么进展,所以请不要把这个当作那个问题的重复。

问题:

我有一个图(G=(V,E))。在我的算法的某个阶段,我需要将这个图“压缩”成一个超图,具体来说,就是把多个节点(比如说,v_1, v_2, ..., v_n)合并成一个节点(比如说,v)。在这个问题的背景下,这意味着我需要改变边 E,使得任何连接 v_1, v_2, v_n 和其他节点 u 的边 e,现在都变成连接 uv 的边。

为了表示现在可能存在多个不同的边连接任何一对节点,我需要为每条边创建一个唯一的标识符。我尝试通过一个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

我会很感激任何帮助

谢谢

4 个回答

2

在创建任何边(Edge)之前,你可以像下面这样把类的变量明确设置为0:

Edge._ID = 0
e = Edge(1,3,5,10,0)
f = Edge(2,3,4,5,0)

这样,id就会被正确设置了。

5

你修改后的代码把 _ID 当成了实例变量来处理,而不是类变量。根据 Matt Joiner 的回答,我觉得你想表达的是这个:

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

当我用这个 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

这是你想要的结果。不过,其他人指出你的原始代码对他们来说是有效的,就像这段代码对我也有效一样,所以我怀疑真正的问题可能在你代码的其他地方。

3

你仍然可以用 self 来获取 _ID

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

如果你在使用 CPython,你可以拥有一个懒人的 ID:

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

撰写回答