オブジェクトの多くのインスタンスをインスタンス化する問題に取り組んでいます。ほとんどの場合、インスタンス化されたオブジェクトは同一です。メモリのオーバーヘッドを減らすために、すべての同一オブジェクトが同じアドレスを指すようにしたいと考えています。ただし、オブジェクトを変更するときは、新しいインスタンスを作成する必要があります。つまり、基本的にコピー オン ライト動作です。Pythonでこれを達成する最良の方法は何ですか?
Flyweight パターンが近づいています。例 ( 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
更新: 私は Flyweight パターンに出会いました。しかし、私は他のアプローチにもオープンです。