Уведомления

Группа в Telegram: @pythonsu

#1 Июль 5, 2010 13:47:14

Asim
От:
Зарегистрирован: 2010-03-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок удаления объектов

Подскажите пожалуйста по сабжу:
пусть есть три класса 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 -ом )



Отредактировано (Июль 5, 2010 13:57:27)

Офлайн

#2 Июль 5, 2010 15:47:11

nerijus
От:
Зарегистрирован: 2010-06-03
Сообщения: 93
Репутация: +  1  -
Профиль   Отправить e-mail  

Порядок удаления объектов

Возможно я чего то не понимаю, но вот такой код:

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
А если объекты зависят друг от друга, то прежде всего нужно референсы снять.



Офлайн

#3 Июль 6, 2010 14:28:16

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Порядок удаления объектов

Не совсем понятно, зачем Вам это надо. Смею предположить, что класс, помеченый у Вас как “С” использует какие-то внешние ресурсы. И Вам их надо освободить до того, как будут уничтожены экземпляры классов “A” и “B”. И ресурсы Вы освобождаете, как принято в С++, в деструкторе.

Если это так, то в питоне есть директива with как раз для ограничения использования ресурсов. Вам необхдимо определить у python-класса два метода __enter__ и __exit__. Первый отвечает за получение ресурсов, а второй, за их освобождение. Ну и вынести процедуры получения и освобождения ресурсов в Вашем С++ коде в отдельный методы (которые следует напрямую вызывать из __enter__ и __exit__), поскольку python это скриптовый язык и за освобождение используемой памяти отвечает Garbage Collector. И когда и в какой последовательности ресурсы будут освобождаться, в общем случае неизвестно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version