Python:有用的Rational类,带有运算符重载

时间:2013-07-29 17:04:40

标签: python class python-2.7 python-3.x operator-overloading

所以我试图在python中创建以下类:

该类应使用整数实例变量来存储有理数的分子和分母。 有理数必须以简化形式存储。 有理数的符号反映在分子的符号上。 该类必须执行数据验证以确保分母不为零。

此外,我想要合并以下重载的opeartors: +和 - 算术运算符 + - * / // 这些运算符应使用以下参数类型组合: (Rational,Rational) (Rational,int) (int,Rational) 关系运算符 这些是二元运算符< < = ==> => != 这些运算符应使用以下参数类型组合: (Rational,Rational) (Rational,int) (int,Rational)

我还想要两种不同的访问方法: numerator,返回有理数的分子 分母,返回有理数的分母

谢谢你们!

2 个答案:

答案 0 :(得分:1)

fractions.Fraction可以完成您需要的一切。

答案 1 :(得分:0)

这项任务相对简单。

class Rational(object):
    __slots__ = ['numerator', 'denominator']
    def __init__(self, numerator, denominator=1):
        # initialize and verify, divide both parameters by GCD of both

要实现运算符,请使用特殊方法名称:

def __add__(self, other):
    # add rational to something else
def __radd__(self, other):
    # same, but with operands reversed
    return self + other

然后继续实施__sub____mul__等。Python Data Model: 3.37 Emulating numeric types文档部分提供了完整列表。比较运算符名为__lt____le__等。您可以通过以下方式实现操作:

def __add__(self, other):
    x_numer = self.numerator
    x_denom = self.denominator
    if isinstance(other, Rational):
        y_numer = other.numerator
        y_denom = other.denominator
    elif isinstance(other, int):
        y_numerator = other
        y_denominator = 1
    else:
        return NotImplemented
    return Rational(x_numer * y_denom + y_numer * x_denom, x_denom * y_denom)

您可能需要实施其他运营商,例如__repr____str__

我希望这足以让你开始,其他方法就像上面的__add__一样。