在 Python 中销毁单例对象
Destroying a Singleton object in Python
我在 Python 中有一个单例对象:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
@classmethod
def destroy(cls):
del cls._instances[cls]
class MockObject(metaclass=Singleton):
def __init__(self, *args, **kwargs):
# various things
我想在某个时候销毁对象,所以我在元类中写了一个类方法。但是,cls
指的是元类 Singleton
而不是 MockObject
。有没有办法调用值为 MockObject
的 destroy
函数?
不要定义用于删除实例引用的自定义方法,而是使用 WeakValueDictionary
.
现在,当任何地方不再有 MockObject
的引用时,它将自动从 Singleton._instances
中清除。
from weakref import WeakValueDictionary
class Singleton(type):
_instances = WeakValueDictionary()
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
# This variable declaration is required to force a
# strong reference on the instance.
instance = super(Singleton, cls).__call__(*args, **kwargs)
cls._instances[cls] = instance
return cls._instances[cls]
class MockObject(metaclass=Singleton):
def __init__(self, *args, **kwargs):
pass
if __name__ == '__main__':
m = MockObject()
print(dict(Singleton._instances))
del m
print(dict(Singleton._instances))
输出:
{<class '__main__.MockObject'>: <__main__.MockObject object at 0x104531128>}
{}
我在 Python 中有一个单例对象:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
@classmethod
def destroy(cls):
del cls._instances[cls]
class MockObject(metaclass=Singleton):
def __init__(self, *args, **kwargs):
# various things
我想在某个时候销毁对象,所以我在元类中写了一个类方法。但是,cls
指的是元类 Singleton
而不是 MockObject
。有没有办法调用值为 MockObject
的 destroy
函数?
不要定义用于删除实例引用的自定义方法,而是使用 WeakValueDictionary
.
现在,当任何地方不再有 MockObject
的引用时,它将自动从 Singleton._instances
中清除。
from weakref import WeakValueDictionary
class Singleton(type):
_instances = WeakValueDictionary()
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
# This variable declaration is required to force a
# strong reference on the instance.
instance = super(Singleton, cls).__call__(*args, **kwargs)
cls._instances[cls] = instance
return cls._instances[cls]
class MockObject(metaclass=Singleton):
def __init__(self, *args, **kwargs):
pass
if __name__ == '__main__':
m = MockObject()
print(dict(Singleton._instances))
del m
print(dict(Singleton._instances))
输出:
{<class '__main__.MockObject'>: <__main__.MockObject object at 0x104531128>}
{}