2015-01-21 4 views
-2

Ниже мой код:Как удалить объект, созданный другим модулем?

from ab import Ab 

class Xyz: 
    def __init__(): 
     self.a = Ab.get_unique_instance() 

Это как функция get_unique_instance() определяется в ab.py

class Ab: 
    instance = [] 
    def get_unique_instance(): 
     if len(Ab.instance) == 0: 
      new_instance = Ab() 
      Ab.instance.append(new_instance) 
     return Ab.instance[0] 

Это делается для того, только один экземпляр Ab является когда-либо. Проблема в том, что экземпляр Ab остается в памяти, даже когда объект, созданный из класса Xyz, выходит за рамки. Как удалить этот объект явно?

+0

Если вы только когда-либо захотите, то почему 'Ab.instance' список? Вы могли бы использовать 'weakref' экземпляр, поэтому, когда все остальные ссылки на него выходят за рамки, он удаляется. – jonrsharpe

+0

Вы можете сделать 'del self.a', но если вы можете предоставить, как вы тестируете' instace of Ab все еще в памяти', тогда мы можем дать лучший ответ. – Nilesh

+0

Вы также можете посмотреть этот пост [http: // stackoverflow.com/q/6760685/1982962) для создания singleton в python –

ответ

2

Вот одна из возможных реализаций, используя weakref, чтобы гарантировать, что только внешние ссылки (т.е. неSingle._instance) засчитываются счетчик ссылок:

import weakref 

class Single(object): 

    _instance = None 

    def __init__(self): 
     print "I've been born" 

    def __del__(self): 
     print "I'm dying" 

    @classmethod 
    def get_instance(cls): 
     if cls._instance is not None and cls._instance() is not None: 
      return cls._instance() 
     instance = cls() 
     cls._instance = weakref.ref(instance) 
     return instance 

Поэтому у вас есть самое большее один Single в точке а но не может иметь ничего, если все ссылки удалены (и новый будет создан при следующем вызове метода класса). При использовании:

>>> a = Single.get_instance() 
I've been born 
>>> b = Single.get_instance() 
>>> a is b 
True 
>>> del a 
>>> del b 
I'm dying 
>>> c = Single.get_instance() 
I've been born 
>>> del c 
I'm dying 
Смежные вопросы