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

问题描述 投票:0回答:1

我正在定义理性类,所以例如a = Rational(1,2)#1/2,b = Rational(2,3)#2/3,我想要c = a + b使得c =理性(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个),它在上面的编码中出错了吗?谢谢!

python class overloading operator-keyword rational-numbers
1个回答
0
投票

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

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

事实上,你可以用你的附加功能做的最好的事情是将self.value + value2.value作为float返回。所以现在,你的班级基本上是一个冗长的分工方式!为了有一个有意义的Rational课程,我强烈建议你尽可能地用分子和分母来保持一切。


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

© www.soinside.com 2019 - 2024. All rights reserved.