【问题标题】:How to deregister a class entry from Metaclass?如何从 Metaclass 中注销类条目?
【发布时间】:2014-07-10 08:00:25
【问题描述】:

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

这里是代码 sn-p 以便更好地理解:

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

【问题讨论】:

    标签: python python-2.7 singleton metaclass


    【解决方案1】:

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

    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
    

    【讨论】:

    • 哦,是的.. python 中没有private
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2017-12-31
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多