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
你可以在上面看到我希望 session1
和 session1a
是同一个对象,因为 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
我希望 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
你可以在上面看到我希望 session1
和 session1a
是同一个对象,因为 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