鱼C论坛

 找回密码
 立即注册
查看: 956|回复: 6

[已解决]怎么理解这段43课变异程序的执行过程?

[复制链接]
发表于 2017-12-18 15:51:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冰封雪舞 于 2017-12-19 00:54 编辑

为了理解魔法方法里边内置函数改写,
我把甲鱼老师的的程序改了几次,
改成这样了,结果更迷糊了,
程序如下:

class New_int(int):
    def __add__(self, other):
        print('self是%s,other是%s'% (self,other))
        other = other + 10
        print(self,other)
        return int.__add__(self,other)
a = New_int('2')
b = New_int('3')
c = New_int('4')

d = a+b+c
print(b+a+0)
print(d)

结果是:
self是2,other是3
self是3,other是10
3 20
2 23
self是3,other是2
self是2,other是10
2 20
3 22
25
29
我发现每次other=other+10把我搞糊涂了,
为什么实例化时给第一个加号的左右赋值时other会连加,后边再连加,other不连加了?
而且other的值,实例化在计算前它在不断地变化。
如果我把加号放到前边,other就完全失效了,如print(+a+b),而且函数里边的print也不执行了。
换成比较明白的问题说话:
1. 为什么other=other+10,只在a+b中连续加成20,如果是a+b+c或者后边+d+e+f等连续加法中就不累加了?
2.为什么把加号放到前边,如+a+b,这个函数就完全不执行other= other+10的语句了,里边的print语句也不执行了,完全成为正常的加了,得数就是5。
最佳答案
2017-12-19 22:55:09
冰封雪舞 发表于 2017-12-19 22:49
两个问题变成1.other = other +10,为什么a+b+c后不会累加到30还是20
                  2.为什么+a是int ...

1.因为 a + b 的和是 int 类型的,再 + c 的话调用的是 int 类的__add__方法。

2. +a 应该是前面加 + 号的时候调用了 int 方法,具体我没去查看,不过我猜测应该是这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-18 16:13:25 | 显示全部楼层
你这到底是哪里不明白啊? 说重点呗,写得太乱,看不明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-18 16:27:36 | 显示全部楼层
看完之后一个 "乱" 字了得
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 00:52:19 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-18 16:13
你这到底是哪里不明白啊? 说重点呗,写得太乱,看不明白。

1. 为什么other=other+10,只在a+b中连续加成20,如果是a+b+c或者后边+d+e+f等连续加法中就不累加了?
2.为什么把加号放到前边,如+a+b,这个函数就完全不执行other里边的+10了,里边的print语句也不执行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 11:55:58 | 显示全部楼层
冰封雪舞 发表于 2017-12-19 00:52
1. 为什么other=other+10,只在a+b中连续加成20,如果是a+b+c或者后边+d+e+f等连续加法中就不累加了?
2. ...

1.累加到 20 是因为 10 + 10 是两个 int类型的相加,所以不会再调用这个New_int的 方法了;这个连加这个我也不是很明白。

2.因为 + a 是 int 类型的, +a + b 调用的是 int类的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 22:49:20 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-19 11:55
1.累加到 20 是因为 10 + 10 是两个 int类型的相加,所以不会再调用这个New_int的 方法了;这个连加这个 ...

两个问题变成1.other = other +10,为什么a+b+c后不会累加到30还是20
                  2.为什么+a是int类型,a不是?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 22:55:09 | 显示全部楼层    本楼为最佳答案   
冰封雪舞 发表于 2017-12-19 22:49
两个问题变成1.other = other +10,为什么a+b+c后不会累加到30还是20
                  2.为什么+a是int ...

1.因为 a + b 的和是 int 类型的,再 + c 的话调用的是 int 类的__add__方法。

2. +a 应该是前面加 + 号的时候调用了 int 方法,具体我没去查看,不过我猜测应该是这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表