Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 18, 2012 12:44:52

serj
Зарегистрирован: 2012-06-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление объекта из функции

Здравствуйте.

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

Вот код примера:

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

Офлайн

#2 Сен. 18, 2012 14:32:47

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Удаление объекта из функции

Почитайте, что такое метод __del__ и зачем он нужен. Зачем вам вообще удалять объекты? Сомневаетесь в сборщике мусора или не хотите добавить метод типа flush или teardown?



Офлайн

#3 Сен. 18, 2012 14:57:29

serj
Зарегистрирован: 2012-06-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление объекта из функции

fata1ex
Почитайте, что такое метод __del__ и зачем он нужен. Зачем вам вообще удалять объекты? Сомневаетесь в сборщике мусора или не хотите добавить метод типа flush или teardown?

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

Но все равно вопрос открыт, как все же обработать в функции не ссылки или копии объекта а сам объект без глобальных переменных

Офлайн

#4 Сен. 18, 2012 16:07:14

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

Удаление объекта из функции

Т.к. в функции создаются копии, то и удаляются копии
Не копии. Просто 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)

Офлайн

#5 Сен. 18, 2012 16:18:36

serj
Зарегистрирован: 2012-06-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление объекта из функции

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() !

Офлайн

#6 Сен. 18, 2012 16:32:53

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

Удаление объекта из функции

А что вам вообще нужно? В смысле: закрыть соединения сразу (и несмотря на возможные исключения)? => можно использовать 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)

Офлайн

#7 Сен. 18, 2012 16:55:06

serj
Зарегистрирован: 2012-06-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление объекта из функции

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-модемов и видимо не успевают освободится ресурсы как запускается новый процесс. Если с БД не беда, то с модулем (платный, на №е кол модемов) беда, ругается что превышено кол-во подключений и т.п. Если при краше приложения вручную не освободить, то при закрытии можно.

Офлайн

#8 Сен. 19, 2012 11:34:08

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Удаление объекта из функции

Вы пытаетесь решать не ту задачу. Надо понять, почему падает/закрывается приложение, и добавить аналог 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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version