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 A(object):
    foo1 = MyDesc()

class MyObj(A):

    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
#        for cls in self.__class__.__mro__ + (self, ):
#            if name in cls.__dict__:
#                return object.__setattr__(self, name, value)
#        print 'New name', name, value
#        self.new_names[name] = value

    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')

    print o.bar
    o.bar = 'baz'
    print o.bar
    o.bar = 'baz2'
    print o.bar

    o.bazbar = 'barbaz'
    print o.bazbar

    o.foo = 'quux'
    print o.foo

    o.foo1 = 'quux1'
    print o.foo1

    o.bar = 'baz'
    print o.bar