from __future__ import division
will fix the division problem.
Side note - if you want your rationals to be stored precisely, you should make sure the numerator and denominator are both being stored as ints. If I'm reading it correctly, your gcd function won't work with floats.
To solve this problem you might want to do something like:
def __init__(self, num, den):
num1, den1 = float(num).as_integer_ratio()
den2, num2 = float(den).as_integer_ratio()
self.numerator = num1 * num2
self.denominator = den1 * den2
...