Ein Code, den ich in der [Python-Standardbibliothek] gesehen habe, ist sehr hilfreich:
def all_nodes(self): yield self n = self.other while n and n.name != self.name: yield n n = n.other if n is self: yield n return
Der Zwei Erträge am Anfang und am Ende werden nur einmal als Start- und Endpunkt des Schleifendiagramms zurückgegeben, und n ist ein möglicher Knoten des Diagramms. Der nächste Knoten wird jedes Mal beim nächsten Aufruf zurückgegeben
Mit diesem Iterator können Sie ganz einfach die Struktur des Diagramms ausdrucken:
def __str__(self):
return '->'.join((n.name for n in self .all_nodes()))
Grafik:
eins->zwei->drei->eins
Um eine Diagrammstruktur zu implementieren, müssen Sie schwache Referenzen in Python verwenden.
Schauen wir uns zunächst den Standardcode zum Hinzufügen des nächsten Knotens zur Diagrammstruktur an:
def set_next( self, other):
print '%s.next %r' % ( self.name, other)
self.other = other
Nach der Bindung auf diese Weise fügen Sie im Attributfeld einen Verweis auf den nächsten Knoten hinzu
c.__dict__
{'other':
,
,
,
} ,
},
}]
<🎜 verwenden > um das referenzierte Objekt und die Aktion nach dem Löschen des Objekts anzugeben func< Wenn 🎜>
aufgerufen wird, verwenden Sie c(), um k zu referenzierenAber im vorherigen Beispiel benötigen wir ein „Proxy-Objekt“ dazu Proxy für das referenzierte Objekt, sodass die Funktion set_next auf die Variable other verweisen kann. Kann wie normale Variablen verwendet werden
def set_next(self, other): if other is not None: if self in other.all_nodes(): other = weakref.proxy(other) super(WeakGraph, self).set_next(other) return
Dadurch wird die Notwendigkeit vermieden, über other()~