Ich versuche, eine Klasseninstanz, die zwei Listen einer anderen Instanz enthält, zu beherbergen. Die Instanzen in den beiden Listen haben Attribute, die auf Instanzen der jeweils anderen Klasse verweisen. Hier sind die Klassen.
class Graph:
def __init__(self):
self.vertices = {}
self.edges = set()
def __repr__(self):
return "\n".join(map(str, sorted(self.vertices, key=lambda v:v.id)))
class Edge:
def __init__(self, vfrom, vto):
self.vfrom = vfrom
self.vto = vto
def __hash__(self):
return hash(tuple(map(hash, (self.vto, self.vfrom))))
def __repr__(self):
return str(self.vto.id)
class Vertax:
def __init__(self, id):
self.id = id
self.incoming = set()
self.outgoing = set()
def __repr__(self):
return "Vertax %d -> %s"%(self.id, ", ".join(map(str, self.outgoing)))
def __hash__(self):
return hash(self.id)
Als ich versuchte, ein einfaches Diagramm zu entpicken, gab es eine Fehlermeldung beim Entpicken.
>>> v0 = Vertax(0)
>>> v1 = Vertax(1)
>>> e0to1 = Edge(v0, v1)
>>> v0.outgoing.add(e0to1)
>>> v1.incoming.add(e0to1)
>>> g = Graph()
>>> g.vertices[v0] = v0
>>> g.vertices[v1] = v1
>>> g.edges.add(e0to1)
>>> print g
Vertax 0 -> 1
Vertax 1 ->
>>>
>>> import pickle
>>> p = pickle.dumps(g)
>>> pickle.loads(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/pickle.py", line 1374, in loads
return Unpickler(file).load()
File "/usr/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.6/pickle.py", line 1133, in load_reduce
value = func(*args)
File "<stdin>", line 6, in __hash__
AttributeError: Edge instance has no attribute 'vto'
Ich habe festgestellt, dass der Fehler verschwindet, wenn man die __hash__
Funktion der Klasse Edge. Ich brauche Ihre Hilfe, um zu verstehen, warum dies geschieht.