바운드 메서드는 속한 개체에 대한 참조를 유지합니다. 그렇지 않으면 self
을 채울 수 없습니다 (참조 : Python documentation). 다음 코드를 고려하십시오
import gc
class SomeLargeObject(object):
def on_foo(self): pass
slo = SomeLargeObject()
callbacks = [slo.on_foo]
print [o for o in gc.get_objects() if isinstance(o, SomeLargeObject)]
del slo
print [o for o in gc.get_objects() if isinstance(o, SomeLargeObject)]
callbacks = []
print [o for o in gc.get_objects() if isinstance(o, SomeLargeObject)]
출력 : 콜백에 weakrefs을 유지하는 경우
이
[<__main__.SomeLargeObject object at 0x15001d0>]
[<__main__.SomeLargeObject object at 0x15001d0>]
[]
하나 개 중요한 것은 알고 그들은 항상 즉석에서 만들어지기 때문에 당신이 직접 결합 방법을 weakref 수 없다는 것입니다 :
>>> class SomeLargeObject(object):
... def on_foo(self): pass
>>> import weakref
>>> def report(o):
... print "about to collect"
>>> slo = SomeLargeObject()
>>> #second argument: function that is called when weakref'ed object is finalized
>>> weakref.proxy(slo.on_foo, report)
about to collect
<weakproxy at 0x7f9abd3be208 to NoneType at 0x72ecc0>
물론 신호 처리기가 명시 적으로 연결이 끊어지면 신호 처리기가 어디에서나 참조되지 않고 그 중 아무 것도 가비지 수집을 방해하지 않습니다. 케이스. 약한 참조를 사용하면 신호가 명시 적으로 연결 해제되지 않은 경우에만 차이가 발생하는 것처럼 보이고 요청하지 않으면 신호가 끊어지기를 원하는 이유가 무엇입니까? –
맞습니다. 신호 처리기가 가비지 수집되도록 약한 참조가 없으면 신호 처리기를 삭제하고 신호를 연결 해제해야합니다. 이것은 모든 사람에게 명백하지 않을 수 있으므로, 이것이 약한 참조가 기본적으로 사용되는 이유라고 생각합니다. –
매우 밀도가 높아서 미안하지만 이해가 안됩니다. 나는 당신이 신호를 "연결 해제"한다는 것을 이해하고 있다고 생각한다. 핸들러를 인자로 전달하여'Signal' 인스턴스에서'disconnect' 메소드를 호출하십시오. 하지만 신호 처리기를 "삭제"한다는 것은 무엇을 의미합니까? –