Python 类实例的自动递增ID

Python 类实例的自动递增ID,python,uniqueidentifier,class-instance-variables,Python,Uniqueidentifier,Class Instance Variables,免责声明:这是我目前正在做的一个学期项目。我的问题是关于实施层面的细节,不是评分方案的一部分。我写这段代码只是为了测试我为即将撰写的论文提出的理论 也,我考虑了一些侥幸心理的答案,所以请不要认为这是问题的一个重复。 问题: class Edge: _ID = 0 def __init__(self, u, v, w, c,f=0): self.id = Edge._ID Edge._ID += 1 self.src = u

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

<>也,我考虑了一些侥幸心理的答案,所以请不要认为这是问题的一个重复。 问题

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
我有一个图(G=(V,E))。在我的算法中,我需要通过将多个节点(例如,
v_1,v_2,…,v_n
)“折叠”为一个节点(例如,
v
),将其转换为超图(从某种意义上说)。在问题的上下文中,这意味着我需要更改
E
中的边,这样
v_1、v_2、v_n
v
中的任何其他节点
u
之间的任何边
E
都将更改,以便
E
现在介于
u
v
之间

为了捕获任何一对节点之间现在可能存在多条不同的边,我需要为每条边创建一个唯一的标识符。我试图通过和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
错误:

>>> 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
获取
\u ID

self.id = self._ID 
self.__class__._ID += 1
如果您使用的是CPython,您可以拥有一个懒汉的ID:

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

在实例化任何边缘之前,可以将类变量显式设置为0,如下所示:

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

并且id将被正确设置。

您编辑的代码将
\u 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

这是理想的结果。然而,其他人指出,您的原始代码为他们工作,就像此代码为我工作一样,因此我怀疑真正的问题在您的代码中的其他地方。

而提供的其他答案是回答问题(这就是为什么我不接受我最初接受的问题),正确的方法是使用
itertools.count
如下:

class Edge:
    _ID = itertools.count()
def __init__(self, u, v, w, c,f=0):
    self.id = self._ID.next()

奇怪,这对我很有效。您使用的是什么版本的Python?(我试过2.7和3.1,但以防万一……)这是哪一个版本的Python?它对我不起作用,我正在使用
2.6.5
@inspectorG4dget:您需要在Python2.x中为
对象
创建子类,描述符才能工作ಠ_ಠ谢谢,但我正在使用您的第一个解决方案,只是因为我更熟悉它。但是谢谢你让我知道-我会在我有时间的时候尝试你的第二个解决方案。我想我最初测试的问题更多地与我对代码所做的更改和导入这些更改的解释器之间的并发性问题有关。不知何故,重新启动解释器修复了一些问题。感谢您演示Matt Joiner的代码是如何工作的(+1)。但是既然他/确实/首先得到了正确的答案,我就接受他的回答。再次感谢您的支持help@srgerg您访问self是正确的。_ID是一个实例变量,您需要访问类_ID。您的第一个方法是正确的
self.ID=Edge。_ID;边缘。_ID+=1