如何从Metaclass取消注册类条目?

时间:2014-05-21 15:10:48

标签: python python-2.7 singleton metaclass

我正在使用方法3:来自Creating a singleton in Python的元类来创建来自singleton类的对象。
现在,根据某个事件,我想删除这个单例对象,并从由元类维护的字典中删除它的条目 我怎么能这样做(没有在Singleton类中做任何改变)?

以下是更好理解的代码段:

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]

class MyClass():
    __metaclass__ = Singleton

    def __init__(self, val1):
        self.val1 = val1

obj1 = MyClass(10)
print obj1.val1

del obj1

obj2 = MyClass(20)
print obj2.val1

输出:

10
10

1 个答案:

答案 0 :(得分:2)

只需修改元类型上的字典:

del type(MyClass)._instances[MyClass]

或更直接:

del Singleton._instances[MyClass]

演示:

>>> obj1 = MyClass(10)
>>> print obj1.val1
10
>>> del obj1
>>> obj2 = MyClass(20)
>>> print obj2.val1
10
>>> del obj2
>>> del type(MyClass)._instances[MyClass]
>>> obj3 = MyClass(30)
>>> print obj3.val1
30
相关问题