Распоряжение объектами с круговыми ссылками - PullRequest
2 голосов
/ 30 августа 2011

Мой дизайн выглядит следующим образом:

  • __main__ ссылки a
  • a ссылки b
  • b ссылки a
  • a создается и затем удаляется из __main__

Таким образом, a и b имеют циклические ссылки. Однако после del a я бы предпочел утилизировать a и b.

Во многих местах я вижу совет использовать Менеджеры контекста, и в частности оператор with вместо __del__(). Однако все примеры with, которые я вижу, начинаются и заканчиваются в локальной области (например, определенного метода)

Может ли это быть элегантно выполнено с with?
Какая альтернатива?

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

Я рекомендую либо:

  • Использование weakref - что иногда применимо, когда используются циклические ссылки
  • или ... просто вручную выбрасывать вещи в нужном вам порядке - не в __del__, а в явном dispose методе , который вы вызываете в нужное время

В общем, когда вы знаете, что у вас есть циклические ссылки, полагаться на автоматическое удаление __del__ не очень хорошая идея. Это хрупко - даже если вам удастся заставить его работать в некоторых случаях, небольшие изменения в зависимостях могут сломать его снова.

2 голосов
/ 30 августа 2011

Какая альтернатива?

Ничего не делать.Пока вы не создадите миллионы циклических ссылок, подобных этой, - и не сможете доказать, что это (и только это) нарушает вашу программу, - на самом деле это не имеет значения.

0 голосов
/ 30 августа 2011

Сборщик мусора должен справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...