class MyDesc(object):

    def __init__(self):
        self.val = None

    def __get__(self, instance, owner):
        print "MyDesc.__get__"
        return self.val

    def __set__(self, instance, value):
        print "MyDesc.__set__"
        self.val = value

class MyObj(object):

    foo = MyDesc()

    def __init__(self, bar):
        object.__setattr__(self, 'names', dict(
            bar=bar,
        ))
        object.__setattr__(self, 'new_names', dict())

    def __setattr__(self, name, value):
        print "MyObj.__setattr__ for %s" % name
        try:
            object.__getattribute__(self, name)
        except AttributeError:
            print 'New name', name, value
            self.new_names[name] = value
        else:
            object.__setattr__(self, name, value)

    def __getattr__(self, name):
        print "MyObj.__getattr__ for %s" % name

        if name in self.new_names:
            return self.new_names[name]

        if name in self.names:
            return self.names[name]

        raise AttributeError(name)

if __name__ == "__main__":
    o = MyObj('bar-init')
    o.quux = 3
    print 'dict', o.__dict__
    print 'new_names', o.new_names
    print 'o.quux', o.quux
    print "o.new_names['quux']", o.new_names['quux']