'hash(self)
Tricky because values that are exactly representable as a
float must have the same hash as that float.'

def __hash__(self):

    if (self._denominator == 1):
        return hash(self._numerator)
    else:
        if (self == float(self)):
            return hash(float(self))
        return hash((self._numerator, self._denominator))
