There's a lot of boiler-plate here. Consider implementing a helper function: 

    def _check_levels_get(attribute):
        if 0<= level < self.num_levels:
            return attribute[level]
        return None

And using it in all of these attribute `get_foo` functions.