我正在解决一个问题,我正在实例化一个对象的许多实例。大多数情况下,实例化的对象是相同的。为了减少内存开销,我想让所有相同的对象指向同一个地址。但是,当我修改对象时,我希望创建一个新实例——本质上是写时复制行为。在 Python 中实现这一目标的最佳方法是什么?
享元模式接近。一个例子(来自http://codesnipers.com/?q=python-flyweights):
import weakref
class Card(object):
_CardPool = weakref.WeakValueDictionary()
def __new__(cls, value, suit):
obj = Card._CardPool.get(value + suit, None)
if not obj:
obj = object.__new__(cls)
Card._CardPool[value + suit] = obj
obj.value, obj.suit = value, suit
return obj
其行为如下:
>>> c1 = Card('10', 'd')
>>> c2 = Card('10', 'd')
>>> id(c1) == id(c2)
True
>>> c2.suit = 's'
>>> c1.suit
's'
>>> id(c1) == id(c2)
True
期望的行为是:
>>> c1 = Card('10', 'd')
>>> c2 = Card('10', 'd')
>>> id(c1) == id(c2)
True
>>> c2.suit = 's'
>>> c1.suit
'd'
>>> id(c1) == id(c2)
False
更新:我遇到了享元模式,它似乎几乎符合要求。但是,我对其他方法持开放态度。