I think I understand where the exception raising issue came up.  Your test code called this method unbound (ie. directly from the class instead of from an instance).  When calling unbound methods, Python 2 appears to make an implicit type check on the first argument, requiring it to be an instance of the given class.  Since your test has the first argument as a Line instead of a Point, it raises TypeError before it can get to the check and raise GeometryError.  That's why the test fails.

I'm thinking that, instead of using classmethod as a workaround, just raise TypeError instead of GeometryError.  It is an error caused by having the wrong type, so TypeError makes sense, and then there's no conflict between Python 2 and Python 3 behaviour.