在python中创建一个合理的类和运算符重载

时间:2018-03-06 20:51:08

标签: python class overloading operator-keyword rational-numbers

我定义了理性类,所以例如a = Rational(1,2)#1/2,b = Rational(2,3)#2/3,我想要c = a + b使得c = Rational(7,6)#7/6。到目前为止我的代码是:

class Rational(object):
    def __init__(self, v1, v2):
        self.value = v1/v2
    def  __add__(self, value2):
        return Rational(self.value + value2.value)
a = Rational(1,2)
b = Rational(2,3)
c = a+b

但是我收到TypeError消息, init 需要3个参数(给定2个),在pls上面的编码中哪里出错了?谢谢!

1 个答案:

答案 0 :(得分:0)

根据你的类,通过将分子和分母传递给它来创建Rational的实例,但是在这里你只是通过传递它的(浮点)值来创建一个实例。当然,有可能找到一个与浮动相当的理性,但你没有教会你的课程如何做,而且它不会神奇地逆向工程。

鉴于添加分数的定义:p / q + r / s =(ps + qr)/ qs,您的加法函数应返回Rational(ps + qr, qs)。问题是,你没有跟踪你班上的分子和分母,所以你无法检索这些信息。

就目前而言,使用添加功能可以做的最好的事情是将self.value + value2.value作为float返回。所以现在,你的班级基本上是一个冗长的分工方式!要有一个有意义的Rational课程,我强烈建议你尽可能用分子和分母来保留所有内容。

编辑:我忘了提及 - 如果您使用的是Python 2.x,除非您转换v1中的一个(或两个),否则您的部门将无法正常工作或者在进行除法之前v2float,或者更好的是,在顶部包含行from __future__ import division,以便除法符合您的预期。