以下是我的代码:
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的实例仍然在内存中。如何显式删除此对象?
答案 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