thx! indeed, it worked -- took me some time to figure out how to implement the setting of attributes, too. i finally managed to get that done using super:
custom dictionary, unchanged:: class CustomDict( dict ): defaultValue = 'THIS ITEM NOT AVAILABLE' def __getitem__( self, name ): #print 'CustomDict.__getitem__( %r )' % ( name, ) try: return super( CustomDict, self ).__getitem__( name ) except KeyError: return self.defaultValue def __contains__( self, name ): return True def has_key( self, name ): return True dictionary user class:: class X( object ): def __init__( self ): #print 'X.__init__()' self._dict = CustomDict( foo = 'bar' ) @property def __dict__( self ): #print 'X.__dict__ ( get() )' return self._dict def __getattr__( self, name ): #print 'X.__getattr__( %r )' % ( name, ) return self.__dict__[ name ] def __setattr__( self, name, value ): #print 'X.__setattr__( %r, %r )' % ( name, value, ) if name == '_dict': return super( X, self ).__setattr__( name, value ) self._dict[ name ] = value the ``~.__setattr__()`` method tests for the special name ``_dict`` and defers execution to the super of the ``X`` instance, ``object``. other stuff is handled by the instance itself. testing that with :: x = X() print x.__dict__[ 'foo' ] print x.__dict__[ 'bar' ] print x.foo print x.bar print x.__dict__ x.oops = 42 print x.__dict__ yields :: bar THIS ITEM NOT AVAILABLE bar THIS ITEM NOT AVAILABLE {'foo': 'bar'} {'foo': 'bar', 'oops': 42} as expected. i tried to reason *why* the usage of a property makes this particular piece of code work, but i seemingly can't find out. anyone around who has thoughts on that? _wolfgang -- http://mail.python.org/mailman/listinfo/python-list