Так как кажется, что все слабые ссылки, выпущенные последовательно, не гарантированы (согласно посту Гвидо).Одна вещь, которую вы могли бы сделать, - это использовать одну слабую ссылку в каждом месте, где в противном случае вы генерировали бы новую слабую ссылку (поскольку единственная ссылка должна выглядеть одинаково для всех, кто ее использует).
Здесь вы потеряли бы хороший механизм обратного вызова для всех различных ссылок на ссылки, но вы могли бы восстановить их, поместив в подклассираж слабый_ref.ref и добавив какую-то схему регистрации.Вам также понадобится какой-то способ найти единственный экземпляр слабого рефери.Либо упакуйте его в экземпляр, на который будет ссылаться, и создайте вспомогательный метод для его получения, либо создайте его (помните о проблемах безопасности потоков, используйте getattr со значением по умолчанию, если вы не хотите блокировать тоже).В качестве альтернативы вы можете сделать синглтон, чтобы найти их (используйте первый метод ...).
Когерентное исчезновение в слабых ссылках, похоже, должно быть гарантировано ради здравомыслящих схем запоминания, но использование единственного слабого упоминания должно работать, хотя и за счет переопределения слабой схемы интерпретатора с необходимыми вам гарантиями.
на самом деле вы можете использовать атрибут .__weakref__
, где слабые ссылки появляются в экземплярах интерпретатора и используют метод вспомогательной функции с этим.