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

大神或老师请进来解答一下,不胜感激

学了那么久,这节算是自己没法搞懂的一节了,所以有了这次的提问。

def __add__(self, r):
       return Rational(self.p * r.q + self.q * r.p, self.q * r.q)

>>> r1 = Rational(1, 3)
>>> r2 = Rational(1, 2)
>>> print r1 + r2
5/6

先说我懂的好了,教程说:如果要让Rational进行+运算,需要正确实现__add__。那好,那么在print r1 + r2

时,我理解的因为+号,所以调用了__add__(self, r)方法。但是此方法传进来的参数相当于只有一个参数r,但是实际要实现的是r1+r2,这不是两个参数吗?到底传进来的机制是怎么样的。

然后是传进去后的结果,看了大家的说法,我现在理解的(self.p * r.q + self.q * r.p, self.q * r.q),把它们用数字实际对上后,应该是(1*2+3*1,3*2),这样得到的是(5,6),跟输出结果很符合。

但正是因为上个疑问,传入的参数问题我感觉理解不是很清楚,所以我对(self.p * r.q + self.q * r.p, self.q * r.q)对应的是(1*2+3*1,3*2)感到疑惑,为何self.p  self.q 对应的是r1的分子分母,r 对应的则是r2的分子分母,难道参数传进来的时候把r1传给了self,把r2传给了r?我感觉这种理解显然是不对的。

当然实际上式子对应的数字是不是我所想的那样我也不确定,所以有错的话欢迎指出。

有哪位大神对这些理解的比较好的,请不吝解答,当然如果老师给我解答那也再好不过了。

正在回答

4 回答

r1与r2开始初始化,将Rational(1,2)与Rational(1,4)中初始化为:r1.p=1, r1.p=2 ; r2.p=1, r2.q=4。实际上这时 r1=1/2, r2=1/4 (str形式,只不过没调用print输出)

print r1+r2   根据上面同学给出的定义,+号左面的默认传递给self, 右边默认传递给r(形参),同时+号调用__add__方法(这里就应该是特殊方法的特殊之处),求得结果,然后递归使用Rational()得到str形式的结果,print。

0 回复 有任何疑惑可以回复我~
def __add__(self,r):
    if isinstance(r,Rational) == False:
        return Rational(self.p * r.q + self.q * r.p,self.q * r.q)
        print 'r is :',type(r)
    print 'r is :',type(r)
    print 'self is :',type(self)

可以得到

r is : <class '__main__.Rational'>

self is : <class '__main__.Rational'>

他们对应的是r1和r2两个对象

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

定义运算的时候有两个参数:self和r,不同的运算符调用不同的运算,举个例子,如果你print r1+r2 那么r1传给self,r2就传给r,如果你print r2 +r1 r2就是self,r1就是r

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

http://img1.sycdn.imooc.com//55f116e10001a77008250356.jpg

(http://infohost.nmt.edu/tcc/help/lang/python/examples/rational/the-code.html#Rational-add)

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

举报

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

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

进入课程

大神或老师请进来解答一下,不胜感激

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信