Python 具有相同属性的单例对象应该引用相同的对象

Python Singleton objects with the same attribute should reference to the same object

我希望 Python 到 return 使用相似属性创建实例时的同一对象。此外,当我更改一个实例的某些属性时,该属性也应该在其他实例之间同步。

class Session:
    def __init__(self, id):
        self.id = id 
        self.data = None

session1 = Session(1)
session1.data = 202
print(session1.data) # 202
print(id(session1)) # should be 1111

session11 = Session(1)
print(session11.data) # 202
print(id(session11)) # should be the same as session1 -> 1111

session2 = Session(2)
print(id(session2)) # 2222

你可以在上面看到我希望 session1session1a 是同一个对象,因为 Session(1),而 session2 是另一个对象,因为 Session(2).

我该怎么做?

您可以将 __new__ 方法重写为 return 具有相同参数的缓存对象。

weakref.WeakValueDictionary 是一种适合存储缓存对象的数据结构,当对象被删除时,它们将被垃圾收集而不是持久化,因为您的缓存引用了它们

from weakref import WeakValueDictionary


class Session:

    _cache = WeakValueDictionary()

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

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

相同的对象将被 return编辑为相同的 id

s1 = Session(1)
print(id(s1))  # 4532746224
s2 = Session(1)
print(id(s2))  # 4532746224
s3 = Session(2)
print(id(s3))  # 4534405248