Найти - Пользователи
Полная версия: Удаление объекта из функции
Начало » Python для новичков » Удаление объекта из функции
1
serj
Здравствуйте.

Подскажите как удалить экземпляр объекта как в примере.
Т.к. в функции создаются копии, то и удаляются копии, мне надо удалить исходные объекты.

Вот код примера:
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
fata1ex
Почитайте, что такое метод __del__ и зачем он нужен. Зачем вам вообще удалять объекты? Сомневаетесь в сборщике мусора или не хотите добавить метод типа flush или teardown?
serj
fata1ex
Почитайте, что такое метод __del__ и зачем он нужен. Зачем вам вообще удалять объекты? Сомневаетесь в сборщике мусора или не хотите добавить метод типа flush или teardown?

У меня есть несколько своих классов, один работает с БД и закрывает соединение в __del__ и другой, который тоже завершает соединение с портами..
Все это работает в консольном приложении, которое обрабатывает свое закрытие и надо закрыть все коннекты и тд.
Признаюсь о flush и teardown не знал.. почитаю.

Но все равно вопрос открыт, как все же обработать в функции не ссылки или копии объекта а сам объект без глобальных переменных
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 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
serj
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 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()
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

Спасибо что просветили про del() !
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 )
serj
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 )

Смысл в том, что бы при закрытии/падении приложения, другое приложение контролировало это (некий супервизор) и запускало процесс снова.
Все так и происходит, только при закрытии/падении не обрабатывается отключение от БД, закрытие соединение с gsm-модемов и видимо не успевают освободится ресурсы как запускается новый процесс. Если с БД не беда, то с модулем (платный, на №е кол модемов) беда, ругается что превышено кол-во подключений и т.п. Если при краше приложения вручную не освободить, то при закрытии можно.
fata1ex
Вы пытаетесь решать не ту задачу. Надо понять, почему падает/закрывается приложение, и добавить аналог 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
Спасибо что просветили про del()
:o
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