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)