A very basic web framework inspired by Flask
That's a nice mini-flask exercise.

ROUTES = None


Deferring the assignment to later, and initializing to Routes(), would seem more natural, to avoid having to test for is None.

    global ROUTES
    ROUTES = self
...
if __name__ == '__main__':
    @Route('/')


Oh, wait, you're not testing against None. You're just jamming it in there. Consider making the assignment the caller's responsibility.

    self.routes = self.__dict__


It's not obvious to me why you were reluctant to create a new dict(). Doesn't the current implementation preclude callers from creating routes to e.g. '/add' and '/get'?.

def add(self, route, cb):


I'm sure that's a very nice signature, and perhaps cb is the appropriate name to use. But it's obscure, and demands at least a docstring explaining it.

class Routes(object):
...
class Route(object):


Honestly, I'm not in love with the class names, there. It's not immediately obvious to the reader how a Routes is different from a Route, so distinguishing names with plural / singular probably isn't a win. Consider RouteCollection instead. But, better, consider deleting the Route class entirely, and using a method hanging off ROUTES to do the work instead. If you do retain two classes, you really really need to add a docstring to each one explaining what its Single Responsibility is.

class RequestHandler(BaseHTTPRequestHandler):
  Routes()


I suggest turning the ctor call into an assignment: ROUTES = Routes(). Better, make the assignment the responsibility of the "if __name__ is main" clause.

  self.send_msg(ROUTES(self.path))


Clearly this works. But it is less obvious than it might be. Consider ignoring __call__, in favor of boring syntax like ROUTES.get_document(self.path).

      self.send_msg('&lt;center&gt;&lt;h1&gt;404 &lt;/h1&gt;&lt;/center&gt;')


This is correct.

def root():
    return '&lt;h1&gt;&lt;center&gt;&lt;b&gt;It Works &lt;/b&gt;&lt;/center&gt;&lt;/h1&gt;'


I like the root identifier. But the HTML is incorrect, as &lt;center&gt; belongs outside of &lt;h1&gt;. Consider using CSS style= to replace that center.

run()


Please run flake8 and follow its advice to precede this line with two blank lines, setting it off from the decorated root function.

Overall, it's an interesting piece of code, I'm glad you shared it.