Порядок очистки объекта Python – могу ли я использовать ссылку на объект, чтобы заставить GC сначала собрать другой объеPython

Программы на Python
Anonymous
Порядок очистки объекта Python – могу ли я использовать ссылку на объект, чтобы заставить GC сначала собрать другой объе

Сообщение Anonymous »

У меня есть 2 объекта a, b (экземпляры A, B соответственно), которые создаются внутри моего приложения:

Код: Выделить всё

class A:
def __del__(self):
print("A.__del__")

class B:
def __del__(self):
print("B.__del__")

a = A()
b = B()
это будет распечатано (на моей машине :)):

Код: Выделить всё

A.__del__
B.__del__
что означает, что в данном случае порядок сбора мусора является порядком создания.
Что мне нужно, так это принудительно установить порядок сбора мусора , чтобы a был уничтожен после b. Я попробовал сохранить внутри b:

Код: Выделить всё

b._guard = a
но это не помогло, и сначала был уничтожен (по крайней мере, функции __del__ вызывались в том же порядке).
В моем реальном случае используется pybind11, где дедушка и бабушка создают родителя, который затем создает дочерний элемент, и этот дочерний элемент должен быть уничтожен раньше дедушки и бабушки. Сохранение бабушки и дедушки внутри дочернего элемента, похоже, работает, но в этом простом случае, о котором я спрашиваю, это явно не так, поэтому я не думаю, что это надежное решение.
Похоже, что py::keep_alive мог бы помочь мне, если бы мой случай был родительским и дочерним, но поскольку между бабушкой и дедушкой нет связи, я думаю, что это не имеет значения.
Есть ли чистый питонический способ (или аккуратный способ pybind11), чтобы заставить дедушку и бабушку оставаться в живых до тех пор, пока не будет очищен дочерний элемент?>

Подробнее здесь: https://stackoverflow.com/questions/783 ... to-collect

Вернуться в «Python»