如何删除另一个模块创建的对象?

时间:2015-01-21 11:49:52

标签: python events singleton

以下是我的代码:

from ab import Ab

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

这是在ab.py

中定义get_unique_instance()函数的方法
 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实例存在。问题是,即使从类Xyz创建的对象超出范围,Ab的实例仍然在内存中。如何显式删除此对象?

1 个答案:

答案 0 :(得分: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