import weakref
import copy
class Card(object):
_CardPool = weakref.WeakValueDictionary()
def __new__(cls, value, suit, **kwargs):
obj = Card._CardPool.get(value + suit, None)
if not obj:
obj = object.__new__(cls)
obj.value, obj.suit = value, suit
Card._CardPool[value + suit] = obj
return obj
class MyObj(object):
def __init__(self, value, suit):
super(MyObj, self).__setattr__('_internal', Card(value, suit))
def __setattr__(self, name, new_value):
vals = self._internal.__dict__
if name in vals.keys():
vals = vals.copy()
vals[name] = new_value
card = Card(**vals)
super(MyObj, self).__setattr__('_internal', card)
else:
super(MyObj, self).__setattr__(name, new_value)
def __getattr__(self, name):
try:
return getattr(self._internal, name)
except AttributeError:
raise AttributeError("'MyObj' object has no attribute '%s'" % name)