Ich versuche, eine Klasseninstanz mit zwei Listen einer anderen Instanzen zu beizen. Die Instanzen in den zwei Listen haben Attribute, die Instanzen voneinander verweisen. Hier sind die Klassen.AttributeError: Edge-Instanz hat kein Attribut 'vto'
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)
Wenn ich versuchte, einen einfachen Graphen zu säubern, gibt das unpickling einen Fehler aus.
>>> 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'
fand ich, dass der Fehler verschwindet, wenn man die __hash__
Funktion der Edge-Klasse kommentiert werden. Ich brauche deine Hilfe, um zu verstehen, warum das passiert.
Ist "Vertax" eine nicht US-Schreibweise von Vertex? – SingleNegationElimination
Anstatt Hash zu tun (Tupel (map (hash, (self.vto, self.vfrom)))), würde ich 'hash ((self.vto, self.vfrom))' '' tuple .__ hash__ 'Hashes jedes Element darin, so dass die beiden tatsächlich gleichwertig sind. –
TokenMacGuy // Oh, das ist mein Fehler. –