Selbstdurchquerung des Python-Graphen und Verwendung schwacher Referenzen

高洛峰
Freigeben: 2016-10-19 16:43:32
Original
1347 Leute haben es durchsucht

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
Nach dem Login kopieren


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': , 'name': '1'


Auch wenn a = None, b = None, c = None manuell aufgerufen werden, wird das Objekt nicht gelöscht

Müll:[

,

,

,

{'name': 'one', 'other':

} ,

{'name': ' two', 'other':

},

{'name': ' three', 'other':

}]

Und schwache Referenz bedeutet „ein Objekt referenzieren, aber die Zeigeranzahl des referenzierten Objekts nicht erhöhen“

Sie können c = Weekref.ref(k,func)

<🎜 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 referenzieren

Aber 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
Nach dem Login kopieren

Dadurch wird die Notwendigkeit vermieden, über other()~

auf ein anderes Objekt zu verweisen
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage