首页 > 解决方案 > 为类的每个实例创建一个单例

问题描述

我有一个 python 类,我们称它为 C。它的构造函数中有一个字符串。我怎么能确保(设计方面)

x = C('a')
y = C('b')
z = C('a')

这种配置导致x和y指向不同的地方,而x和z指向同一个地方?意义

x is y == False
x is z == True

标签: pythondesign-patterns

解决方案


您可以使用Wea​​kValueDictionary将类的所有现有实例保存在类上类似对象的字典中。在该__new__方法中,您在 dict 中查找现有对象,如果存在则返回它,如果不存在则创建一个新实例并将其保存到 dict

from weakref import WeakValueDictionary


class C:

    __instances = WeakValueDictionary()

    def __new__(cls, value):
        obj = cls.__instances.get(value)
        if not obj:
            obj = object.__new__(cls)
            cls.__instances[value] = obj
        return obj

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

我们对实例使用弱引用,以便在没有其他对象引用它们时对它们进行垃圾回收。


推荐阅读