我希望 Python 在使用相似屬性創建實體時回傳相同的物件。此外,當我更改一個實體的某些屬性時,該屬性也應該在其他實體之間同步。
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因為是另一個物件。session1aSession(1)session2Session(2)
我怎么能做到?
uj5u.com熱心網友回復:
您可以重寫該__new__方法以回傳相同引數的快取物件。
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
相同的物件將回傳相同的id
s1 = Session(1)
print(id(s1)) # 4532746224
s2 = Session(1)
print(id(s2)) # 4532746224
s3 = Session(2)
print(id(s3)) # 4534405248
uj5u.com熱心網友回復:
以下是使用__new__,decorator在 Python 中創建單例類的兩種方法。
- 覆寫
__new__方法
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 5
print(one.a)
#5
print(id(one))
#139889931666384
print(id(two))
#139889931666384
print(one == two)
#True
print(one is two)
#True
- 使用蟒蛇
decorator
def singleton(cls, *args, **kw):
instances = {}
def _singleton(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return _singleton
@singleton
class MyClass(object):
a = 1
def __init__(self, x=0):
self.x = x
one = MyClass()
two = MyClass()
two.a = 3
print(one.a)
#3
print(id(one))
#139944257532352
print(id(two))
#139944257532352
print(one == two)
#True
print(one is two)
#True
one.x = 1
print(one.x)
#1
print(two.x)
#1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429032.html
