鱼C论坛

 找回密码
 立即注册
查看: 3492|回复: 11

关于42课里讲到的魔法方法的一个疑问

[复制链接]
发表于 2016-1-30 16:50:59 | 显示全部楼层 |阅读模式
10鱼币
小甲鱼老师在42讲的视频里面定义了一个类,里面尝试自己来定义int的__add__和__sub__方法:

  1. >>> class Try_int(int):
  2.         def __add__(self,other):
  3.                 return self + other
  4.         def __sub__(self,other):
  5.                 return self - other

  6.        
  7. >>> a = Try_int(3)
  8. >>> b = Try_int(5)
  9. >>> a + b #会进入无限递归
复制代码


但是这样会无限递归 运行出来并不是想要的结果

然后小甲鱼说要这样修改就能解决无限递归这个问题:

  1. >>> class Try_int(int):
  2.         def __add__(self,other):
  3.                 return int(self) + int(other)
  4.         def __sub__(self,other):
  5.                 return int(self) - int(other)

  6.        
  7. >>> a = Try_int(3)
  8. >>> b = Try_int(5)
  9. >>> a + b
  10. 8
复制代码



小甲鱼老师上课也说了为什么会这样。。

可是我仍然不是很理解。。。

求指点。。


最佳答案

查看完整内容

的确, 在实例化Try_int类的时候会调用父类int的构造函数 但是, 这并不能理解为这个实例是int类呀 举个例子: 子女继承于父母, 但是却有别与其父母; Try_int继承于int, 但是却有别于int. Try_int类改写了两个方法, 在执行这两个方法的时候就是改写过的代码了. 至于后面的str类的那个问题, 我推荐你先看一遍Python的str类有哪些方法, 看完你就明白为什么这里不会出现问题.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-30 16:51:00 | 显示全部楼层
碗碗的泡菜坛 发表于 2016-1-30 19:23
可是。。。。都继承了int类了, 生成Try_int的一个实例化对象的时候不是会自动调用int的__n ...


的确, 在实例化Try_int类的时候会调用父类int的构造函数

但是, 这并不能理解为这个实例是int类呀

举个例子:
子女继承于父母, 但是却有别与其父母;
Try_int继承于int, 但是却有别于int.

Try_int类改写了两个方法, 在执行这两个方法的时候就是改写过的代码了.

至于后面的str类的那个问题, 我推荐你先看一遍Python的str类有哪些方法, 看完你就明白为什么这里不会出现问题.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-30 17:21:06 | 显示全部楼层
问题少女

首先你得时刻提醒自己, Try_int类里面的__add__方法和__sub__方法里面的参数也是对象
操作对象的时候注意一下该对象的类型, 这里的self和other皆是Try_int类的对象了
而我们已经重写了Try_int类的__add__方法和__sub__方法, 在方法里面调用自身方法, 你说是不是递归
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-30 19:23:24 | 显示全部楼层
hldh214 发表于 2016-1-30 17:21
问题少女

首先你得时刻提醒自己, Try_int类里面的__add__方法和__sub__方法里面的参数也是对 ...
  1. >>> class Try_int(int):
  2.         def __add__(self,other):
  3.                 return self + other
  4.         def __sub__(self,other):
  5.                 return self - other
复制代码


可是。。。。都继承了int类了, 生成Try_int的一个实例化对象的时候不是会自动调用int的__new__和__init__方法么。。。。那么self和other为什么还是实例对象而不是int(实例对象)?

这一课课后习题里有一题答案是这样:
  1. class Nstr(str):
  2.     def __sub__(self, other):
  3.         return self.replace(other, '')
复制代码


为什么这里就直接self.replace()而不是str(self).replace()??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-30 19:32:44 | 显示全部楼层
hldh214 发表于 2016-1-30 17:21
问题少女

首先你得时刻提醒自己, Try_int类里面的__add__方法和__sub__方法里面的参数也是对 ...

又琢磨了下 好像有点明白了 不过还有点晕。。我去静静
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-30 20:17:34 | 显示全部楼层
hldh214 发表于 2016-1-30 19:47
的确, 在实例化Try_int类的时候会调用父类int的构造函数

但是, 这并不能理解为这个实例是int类呀{:1 ...

看str有哪些方法 你指的是help(str)吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-30 20:21:30 | 显示全部楼层
碗碗的泡菜坛 发表于 2016-1-30 20:17
看str有哪些方法 你指的是help(str)吗

可以在python doc文件里查
sshot-2.png

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
碗碗的泡菜坛 + 3 + 3 + 3 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-30 20:24:37 | 显示全部楼层
zooo 发表于 2016-1-30 20:21
可以在python doc文件里查

啊啊,谢谢~!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-30 20:28:29 | 显示全部楼层
碗碗的泡菜坛 发表于 2016-1-30 20:17
看str有哪些方法 你指的是help(str)吗

好像还挺难找的我直接告诉你原因吧

因为str类没有__sub__方法

评分

参与人数 1荣誉 +5 鱼币 +4 贡献 +2 收起 理由
碗碗的泡菜坛 + 5 + 4 + 2 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-30 20:41:42 | 显示全部楼层
hldh214 发表于 2016-1-30 20:28
好像还挺难找的我直接告诉你原因吧

因为str类没有__sub__方法

懂了 谢谢

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-30 22:57:36 | 显示全部楼层
我也在为这问题发愁。感觉小甲鱼在这一块真没有说明白。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-31 10:25:44 | 显示全部楼层
hnsdchy 发表于 2016-1-30 22:57
我也在为这问题发愁。感觉小甲鱼在这一块真没有说明白。。。


对。。。最好课后多参考网上的文字教程。。我现在基本都要参考一下别人写的教程才能有点感觉
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-19 12:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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