Почему обработка сигнала Django использует слабые ссылки для обратных вызовов по умолчанию?

На теоретическом уровне пустой указатель не является действительно тем же как пустым указателем в C, который должен сказать, что это содержит адрес памяти и вот именно? Раз так тогда это подобно случаю деления на нуль в Математике, где результат не определен.

можно было сделать следующее для этой строки:

string val = GetParameterValue<string>("parameterName");

Просто удаляют ту первую строку и теперь нет повторения:

var val = GetParameterValue<string>("parameterName");

Не обязательно, что Вы ищете, хотя существует вопрос того, как каждый интерпретирует пустой указатель?

18
задан Jason Creighton 10 July 2009 в 16:47
поделиться

2 ответа

Обработчики сигналов хранятся как слабые ссылки, чтобы объект, на который они ссылаются, не собирался сборщиком мусора (например, после явного удаления обработчика сигнала) только потому, что сигнал все еще летает.

12
ответ дан 30 November 2019 в 09:07
поделиться

Связанные методы сохраняют ссылку на объект, которому они принадлежат (в противном случае они не могут заполнить self , см. документацию Python ). Рассмотрим следующий код:

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)]

Вывод:

[<__main__.SomeLargeObject object at 0x15001d0>]
[<__main__.SomeLargeObject object at 0x15001d0>]
[]

Одна важная вещь, которую нужно знать при сохранении weakrefs в обратных вызовах, заключается в том, что вы не можете напрямую связывать методы 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>
6
ответ дан 30 November 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: