Return a path between graph nodes using depth-first search redo
Honestly your code is pretty good.

There are however two things that I would change:


self.nodes to be a dictionary rather than a set. This allows you to remove the need for get_node, and changes it to \$O(1)\$ from \$O(n)\$.
In get_path you pop from one stack and append to another. Instead of doing this manually I'd use the built-in list slicing notation, stack[::-1].