순환 참조가있는 Python 클래스의 종료자를 작성하려고합니다. 약한 참조 콜백이 way to go이라는 것을 알았습니다. 불행히도 콜백이 호출되지 않기 때문에 내가 사용하는 람다처럼 보인다. (: 인쇄 'A1 알라 삭제') 람다 콜백 작품순환 참조로 인해 약한 참조 콜백이 호출되지 않습니다.
A created
B created
순환 참조 분리 만든다 :
def del_A(name):
print('An A deleted:' + name)
class A(object):
def __init__(self, name):
print('A created')
self.name = name
self._wr = weakref.ref(self, lambda wr, n = self.name: del_A(n))
class B(object):
def __init__(self):
print('B created')
if __name__ == '__main__':
a = A('a1')
b = B()
a.other = b
b.other = a
결과 : 예를 들어,이 코드를 실행.
self._wr = weakref.ref(self, del_A(self.name))
...
a = A('a1')
a.name = 'a2'
b = B()
a.other = b
b.other = a
반환 : 콜백 호출 할 때 약한 참조를 초기화하고,하지 않을 때 간단한 함수 호출에 의해 람다 교체도 작동하지만 매개 변수 값은 고정되어
A created
An A deleted:a1
B created
어떤 생각을 왜 람다 콜백이 순환 참조와 함께 작동하지 않습니까?
답장을 보내 주셔서 감사합니다. 그러나 문제가 해결되지 않는다고 생각합니다. 나는 약한 참조를 사용하여 __del__ 메소드를 피한다. – Barthelemy