ID-incrémentée automatique pour les instances de classe
-
25-10-2019 - |
Question
Disclaimer : Ceci est un projet de semestre que je travaille actuellement. Ma question concerne un détail au niveau de la mise en œuvre et ne fait pas partie du système de classement. Je n'écris ce code comme un moyen de tester la théorie que je propose pour le papier que je vais écrire.
En outre, j'ai examiné les réponses cette question avec peu de chance, alors s'il vous plaît ne pas considérer cela comme un double de cette question
Le problème :
I ai un graphe (G = (V, E)). À un certain moment dans mon algorithme, je dois en faire un hypergraphe (dans un sens) par « l'effondrement » de multiples noeuds (disons, v_1, v_2, ..., v_n
) dans un noeud (disons, v
). Dans le contexte du problème, cela implique que je dois changer les bords de E
tels que sera changé toute e
de bord entre l'une des v_1, v_2, v_n
et tout autre noeud u
dans V
tel que e
est maintenant entre u
et v
.
Afin de saisir qu'il peut exister maintenant plusieurs arêtes distinctes entre une paire de noeuds, je dois faire un identifiant unique pour chaque bord. Je l'ai essayé de le faire au moyen et ID, que je suis actuellement incapable de mettre en œuvre correctement.
Voici ce que j'ai essayé :
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
Cependant, lorsque je tente de instancier un nouveau bord, je reçois l'erreur suivante:
>>> 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
EDIT :
Avec les suggestions de quelques réponses, j'ai pu corriger l'erreur instanciation temps. Cependant, une autre erreur persiste. Voici mon code et les erreurs:
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
Erreur:
>>> 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
Je serais reconnaissant toute aide
Merci
La solution
Vous pouvez toujours utiliser self
pour obtenir au _ID
.
self.id = self._ID
self.__class__._ID += 1
Si vous utilisez CPython, vous pouvez l'ID d'un homme paresseux:
class Edge(object):
@property
def id(self): return id(self)
Autres conseils
Votre code est édité traite _ID
comme si elle était une variable d'instance, pas une variable de classe. Sur la base de la réponse de Matt Joiner ce que je pense vous dire est ceci:
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
Quand je lance vos exemples avec cette définition de Edge
, je reçois:
>>> 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
Quel est le résultat souhaité. Cependant, d'autres ont souligné que votre code d'origine a travaillé pour eux, tout comme ce code fonctionne pour moi, donc je pense que le vrai problème est ailleurs dans votre code.
Avant instanciation tout bord, vous pouvez définir la variable de classe explicitement à 0 comme ceci:
Edge._ID = 0
e = Edge(1,3,5,10,0)
f = Edge(2,3,4,5,0)
Et les années id sera correctement réglé.
Alors que les autres réponses proposées sont répondre à la question posée (ce qui est la raison pour laquelle je ne suis pas celui unaccepting je l'ai accepté), la bonne façon de le faire serait d'utiliser itertools.count
comme suit:
class Edge:
_ID = itertools.count()
def __init__(self, u, v, w, c,f=0):
self.id = self._ID.next()