为了账号安全,请及时绑定邮箱和手机立即绑定

为什么python3重定义了__div__之后还是报错?

class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q

    def gcd(self, a, b):
        if a < b:
            a, b = b, a
        while b != 0:
            temp = a % b
            a = b
            b = temp
        return a

    def __add__(self, r):
        upper = self.p * r.q + self.q * r.p
        lower = self.q * r.q
        d = self.gcd(upper, lower)
        upper /= d
        lower /= d
        return Rational(int(upper), int(lower))

    def __sub__(self, r):
        upper = self.p * r.q - self.q * r.p
        lower = self.q * r.q
        d = self.gcd(upper, lower)
        upper /= d
        lower /= d
        return Rational(int(upper), int(lower))

    def __mul__(self, r):
        upper = self.p * r.p
        lower = self.q * r.q
        d = self.gcd(upper, lower)
        upper /= d
        lower /= d
        return Rational(int(upper), int(lower))

    def __div__(self, r):
        upper = self.p * r.q
        lower = self.q * r.p
        d = self.gcd(upper, lower)
        upper /= d
        lower /= d
        return Rational(int(upper), int(lower))

    def __str__(self):
        return '%s/%s' % (self.p, self.q)

    __repr__ = __str__

r1 = Rational(1, 2)
r2 = Rational(1, 4)
print (r1 + r2)
print (r1 - r2)
print (r1 * r2)
print (r1 / r2)

报出的错误是:

print (r1 / r2)
TypeError: unsupported operand type(s) for /: 'Rational' and 'Rational'

为毛?我都已经定义好了啊,python3是不是瞎?在imooc上面通过了,也得出了正确结果,说明在py2上是没有问题的。

正在回答

2 回答

__truediv__

0 回复 有任何疑惑可以回复我~

算了,我自己找到问题了,py3把除法的特殊方法名改成了__truediv__,而不是__div__。

我觉得那么多人不看好py3是有道理的……

4 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255533    人
  • 解答问题       3038    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

为什么python3重定义了__div__之后还是报错?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号