ホームページ >バックエンド開発 >Python チュートリアル >Python グラフの自己走査と弱参照の使用
[Python 標準ライブラリ] で見たコードは非常に役に立ちます:
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
最初と最後の 2 つの利回りは、サイクルの開始点と終了点として 1 回だけ返されます。グラフ、n はグラフ 可能なノード、次の呼び出しで毎回次のノードが返されます
このイテレータを使用すると、グラフの構造を簡単に出力できます:
def __str__(self):
Return ' ->'.join((n .name for n in self.all_nodes()))
Graph:
one->two->three->one
グラフ構造を実装するには、 Python では弱参照を使用する必要があります。
まず、次のノードをグラフ構造に追加するための標準コードを見てみましょう:
def set_next(self, other):
print '%s.next %r' % ( self.name, other)
other = other
このようにバインドした後、属性フィールドに次のノードへの参照を追加します
c.__dict__
{'other':
そのため、a = None、b = None、c = None を手動で呼び出しても、オブジェクトは削除されません
Garbage:[
{'名前': '1', 'その他':
{'名前': '2', 'その他':
{'名前': '3', 'その他' :
そして、弱い参照とは、「オブジェクトを参照するが、参照されるオブジェクトのポインタ数を増加させない」ことを意味します
c = Weekref.ref(k,func)
を使用して、参照されるオブジェクトを指定できますそして、オブジェクト削除後のアクション func
call この場合、c() を使用して k
を参照します。ただし、前の例では、参照されたオブジェクトをプロキシする「プロキシ オブジェクト」が必要です。これにより、set_next 関数を通常の変数と同様の other 変数
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
したがって、other()~