Найти - Пользователи
Полная версия: Порядок удаления объектов
Начало » Python для экспертов » Порядок удаления объектов
1
Asim
Подскажите пожалуйста по сабжу:
пусть есть три класса A, B, C
class B( object ):
def __del__( self ):
print "del B"
pass
class A( object ):
def __del__( self ):
print "del A"
pass
class C( object ):
def __del__( self ):
print "del C"
pass
a = A( )
b = B( )
if True:
c = C()
pass
Результат работы:
del A
del C
del B

Вопрос следующий: я думал что отступы в Python подобны фигурным скобкам в С++( при выходе за которые переменная уничтожается) видимо это не так?
Есть ли какой нубдь другой способ удаления переменных по порядку кроме с=С() занести в функцию и эту функцию вызвать вместо if?
Пример упростил, на самом деле А,B,C зависят друг от друга и weakref-ом поигратся особой возможности нет ( обернут С++ код Swig -ом )
nerijus
Возможно я чего то не понимаю, но вот такой код:
class B( object ):
def __del__( self ):
print "del B"

class A( object ):
def __del__( self ):
print "del A"

class C( object ):
def __del__( self ):
print "del C"

a = A( )
b = B( )
c = C()
del c
del b
del a
выводит:
del C
del B
del A
А если объекты зависят друг от друга, то прежде всего нужно референсы снять.
ziro
Не совсем понятно, зачем Вам это надо. Смею предположить, что класс, помеченый у Вас как “С” использует какие-то внешние ресурсы. И Вам их надо освободить до того, как будут уничтожены экземпляры классов “A” и “B”. И ресурсы Вы освобождаете, как принято в С++, в деструкторе.

Если это так, то в питоне есть директива with как раз для ограничения использования ресурсов. Вам необхдимо определить у python-класса два метода __enter__ и __exit__. Первый отвечает за получение ресурсов, а второй, за их освобождение. Ну и вынести процедуры получения и освобождения ресурсов в Вашем С++ коде в отдельный методы (которые следует напрямую вызывать из __enter__ и __exit__), поскольку python это скриптовый язык и за освобождение используемой памяти отвечает Garbage Collector. И когда и в какой последовательности ресурсы будут освобождаться, в общем случае неизвестно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB