[파이썬 표준 라이브러리]에서 본 코드가 매우 도움이 되었습니다:
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
시작과 끝의 두 수율은 루프 그래프의 시작점과 끝점으로 한 번만 반환되며 n은 그래프의 가능한 노드입니다
이 반복자를 사용하면 그래프의 구조를 쉽게 인쇄할 수 있습니다:
def __str__(self):
return '->'.join((n.name for n in self .all_nodes()))
그래프:
하나->둘->셋->하나
파이썬에서 약한 참조를 사용해야 하는 그래프 구조를 구현하려면
먼저 그래프 구조에 다음 노드를 추가하는 표준 코드를 살펴보겠습니다.
def set_next( self, other):
print '%s.next %r' % ( self.name, other)
self.other = other
이 방법으로 바인딩한 후 속성 필드에 다음 노드에 대한 참조를 추가합니다
c.__dict__
{'other':
따라서 a = None, b = None, c = None을 수동으로 호출하더라도 해당 객체는 삭제되지 않습니다
쓰레기:[
{'이름': '하나', '기타':
{'이름': '둘', '기타':
{'이름': '셋', '기타':
약한 참조는 "객체를 참조하지만 참조된 객체의 포인터 수를 늘리지 않음"을 의미합니다.
c = weekref.ref(k,func)
참조된 개체와 개체 삭제 후 작업 지정 func
이 호출되면 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()를 통해 다른 객체를 참조할 필요가 없습니다~