Предположим, у нас есть класс на питоне:
class A(object):
def __del__(self):
print "Del!"
__del__
вызывается при удалении/сборке мусора любого экземпляра A
.
Можно ли сделать то же самое для класса? Я хотел бы, чтобы какой-то метод вызывался, когда сам класс собирает мусор, что, как я полагаю, выполняется при выходе из скрипта.
Заранее спасибо за любые указатели!
Редактировать: Как я и ожидал, все пытаются отговорить меня от использования этой техники (я, наверное, сам сделал бы такой комментарий:)), хотя вопрос остается в силе: возможно ли это?
Я хочу следующее: у меня есть класс со статическим членом, который нужно очистить.
class A(object):
class Meta(type):
def __new__(mcs, name, bases, attrs):
attrs['conn'] = sqlite3.connect( DB_FILE )
return type.__new__(mcs, name, bases, attrs)
__metaclass__ = Meta
Я хотел бы, чтобы A.conn.close()
вызывался, но непосредственно перед закрытием программы, т.е. когда я знаю, что больше экземпляров A
не будет создано. Я знаю, что могу сделать это с atexit
, но это выглядит очень некрасиво.
__del__
уже подозрительно. Это может сделать объекты неспособными к сборке мусора (при наличии цикла сборщик мусора не знает, в каком порядке они должны вызываться, поскольку, вероятно, есть некоторые зависимости), и поскольку это недетерминировано, очистку лучше помещать в контекст управляющий делами. Как вы думаете, зачем вам это нужно? - person   schedule 10.04.2011__call__
для создания нового экземпляра желаемого класса и метод__del__
, который делает то, что вы хотите. - person Oleh Prypin   schedule 10.04.2011SQLObject
илиSQLAlchemy
обрабатывают соединения с БД? (т.е. они открыты все время и когда они закрыты) - person pajton   schedule 10.04.2011atexit
вMeta::__new__
и скрыть его уродство? - person martineau   schedule 10.04.2011