I was looking at turning the existing cube attributes into dictionaries:
        self._dim_coords_and_dims = []
        self._aux_coords_and_dims = []
        self._aux_factories = []

into something like:
self._dim_coords_and_dims = {coord_defn: tuple(coord, dim), ..., ..., }

This would have a similar capability without architectural change, having a coord-dim association by using dictionary key lookup.
what do you think?  My idea however does not make an architectural change and it does feel like an architectural change may improve code clarity (at least in med. term to address how coordinate-dimensions are associated and called).

@rhattersley, I like your idea as it addresses this architectural change, how about everyone else?
I got confused at first since this is not strictly a case of bound and unbound methods in the python sense, since the coordinate as a method on the cube is bound to that instance irrespective of whether a coordinate exists away from the cube.