Форум сайта python.su
0
Здравствуйте.
Подскажите как удалить экземпляр объекта как в примере.
Т.к. в функции создаются копии, то и удаляются копии, мне надо удалить исходные объекты.
Вот код примера:
class ttest(): def __init__(self): self.a = 100 def __del__(self): self.a = 0 def del_obj(*args): for obj in args: if obj: try: print 'del %s' % obj del(obj) except: pass a,b = ttest(), ttest() print a.a,b.a del_obj(a,b) print a.a,b.a
Офлайн
52
Почитайте, что такое метод __del__ и зачем он нужен. Зачем вам вообще удалять объекты? Сомневаетесь в сборщике мусора или не хотите добавить метод типа flush или teardown?
Офлайн
0
fata1ex
Почитайте, что такое метод __del__ и зачем он нужен. Зачем вам вообще удалять объекты? Сомневаетесь в сборщике мусора или не хотите добавить метод типа flush или teardown?
Офлайн
20
Т.к. в функции создаются копии, то и удаляются копииНе копии. Просто del не вызывает сразу __del__ метод:
http://docs.python.org/reference/datamodel.html#object.__del__
Note del x doesn’t directly call x.__del__() — the former decrements the reference count for x by one
class ttest(object): def __init__(self): self.a=100 print id(self) def __del__(self): print "dying :(", id(self) self.a=0 def del_obj(*args): for obj in args: if obj: try: print type(obj),'del',id(obj) del(obj) except: pass a,b = ttest(), ttest() print a.a,b.a del_obj(a,b) print a.a,b.a del([a,b])
>>> a,b = ttest(), ttest()
63513880
63513936
>>> print a.a,b.a
100 100
>>> del_obj(a,b)
<class '__main__.ttest'> del 63513880
<class '__main__.ttest'> del 63513936
>>> print a.a,b.a
100 100
>>> del([a,b])
dying :( 63513880
dying :( 63513936
Отредактировано EBFE (Сен. 18, 2012 16:17:58)
Офлайн
0
EBFEТ.к. в функции создаются копии, то и удаляются копииНе копии. Просто del не вызывает сразу __del__ метод:http://docs.python.org/reference/datamodel.html#object.__del__
Note del x doesn’t directly call x.__del__() — the former decrements the reference count for x by oneclass ttest(object): def __init__(self): self.a=100 print id(self) def __del__(self): print "dying :(", id(self) self.a=0 def del_obj(*args): for obj in args: if obj: try: print type(obj),'del',id(obj) del(obj) except: pass a,b = ttest(), ttest() print a.a,b.a del_obj(a,b) print a.a,b.a del([a,b]) >>> a,b = ttest(), ttest() 63512704 63513376 >>> print a.a,b.a 100 100 >>> del_obj(a,b) <class '__main__.ttest'> del 63512704 <class '__main__.ttest'> del 63513376 >>> print a.a,b.a 100 100 >>> del([a,b]) dying :( 63514048 dying :( 63513488
Офлайн
20
А что вам вообще нужно? В смысле: закрыть соединения сразу (и несмотря на возможные исключения)? => можно использовать with: http://preshing.com/20110920/the-python-with-statement-by-example
закрыть все при завершении? => atexit http://docs.python.org/library/atexit.html
И.т.д - наверняка найдется подходящий шаблон или готовое решение (например Pooling http://pypi.python.org/pypi?%3Aaction=search&term=pool&submit=search )
Отредактировано EBFE (Сен. 18, 2012 16:34:36)
Офлайн
0
EBFE
А что вам вообще нужно? В смысле: закрыть соединения сразу (и несмотря на возможные исключения)? => можно использовать with: http://preshing.com/20110920/the-python-with-statement-by-example
закрыть все при завершении? => atexit http://docs.python.org/library/atexit.html
И.т.д - наверняка найдется подходящий шаблон или готовое решение (например Pooling http://pypi.python.org/pypi?%3Aaction=search&term=pool&submit=search )
Офлайн
52
Вы пытаетесь решать не ту задачу. Надо понять, почему падает/закрывается приложение, и добавить аналог finally, который всегда бы закрывал соединение.
PS.
fata1ex
Почитайте, что такое метод __del__
serj
…
EBFE
Note del x doesn’t directly call x.__del__() — the former decrements the reference count for x by one
serj:o
Спасибо что просветили про del()
Офлайн