鱼C论坛

 找回密码
 立即注册
查看: 2090|回复: 8

第42/43节课的魔法方法理解

[复制链接]
发表于 2017-1-5 22:06:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 fczh 于 2017-1-5 22:09 编辑

小白一枚,对于42/43节课中讲述的魔法方法实在不理解。谁能给画个流程,解释下面的代码到底是怎么进行计算的?nint(int)中int是 还是参数?跪谢各位哥哥!

>>> class nint(int):
        def __radd__(self,other):
                return int.__sub__(self,other)
       
>>> a=nint(5)
>>> b=nint(3)
>>> a+b
8
>>> 1+b
2




~1PH1@@O27]}E7}U~IW3T{Q.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-6 09:05:35 | 显示全部楼层
return int.__sub__(self,other)
这句你是不是没注意int.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-6 09:55:39 | 显示全部楼层
class Nint(int):
中的int是父类,Nint是子类,这是继承
其中a+b使用的是add的方法,没有被重写,所以结果是8
但是1+b使用的是radd的方法,被重写了,返回的是减法的方法所以结果就是b-1也就是2了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-13 21:32:45 | 显示全部楼层
小茗同学 发表于 2017-1-6 09:55
class Nint(int):
中的int是父类,Nint是子类,这是继承
其中a+b使用的是add的方法,没有被重写,所以结 ...

原来如此,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-10 12:09:50 | 显示全部楼层
小茗同学 发表于 2017-1-6 09:55
class Nint(int):
中的int是父类,Nint是子类,这是继承
其中a+b使用的是add的方法,没有被重写,所以结 ...

请教一下,我分别用dir(a)和dir(1)看里面都有__add__这个方法,不明白视频中怎么讲 1 没有__add__,所以使用反加法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-10 17:11:59 | 显示全部楼层
小田鸡 发表于 2017-2-10 12:09
请教一下,我分别用dir(a)和dir(1)看里面都有__add__这个方法,不明白视频中怎么讲 1 没有__add__, ...

int类型里面是有__add__但是,Nint是自定义类型,不匹配int里面的__add__,所以会检测执行右值的__radd__方法
你实现了radd方法,所以语法检测通过执行该方法。
如果左右值都不能匹配一个合适的add和radd方法就会报错TypeError: cannot concatenate
比如一个int和str直接相加就会报如此错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-11 13:53:48 | 显示全部楼层
小茗同学 发表于 2017-2-10 17:11
int类型里面是有__add__但是,Nint是自定义类型,不匹配int里面的__add__,所以会检测执行右值的__radd__ ...

其实关键我是不能理解怎样知道这个对象有没有__add__这个方法,因为dir(str)  dir(a)a是继承int的Nint类的实例  dir(1) 里都有__add__方法。

您的意思是不同的类里面的父类int虽然都有__add__这个方法,但是之间Nint的实例跟int的实例之间的__add__是不匹配的么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 09:45:19 | 显示全部楼层
小田鸡 发表于 2017-2-11 13:53
其实关键我是不能理解怎样知道这个对象有没有__add__这个方法,因为dir(str)  dir(a)a是继承int的Nint类 ...

对,就好像‘abc’+1会报错Can't convert 'int' object to str implicitly一样
int和Nint也是不同的类,虽然都有__add__方法,但是不能匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 12:10:54 | 显示全部楼层
小茗同学 发表于 2017-2-13 09:45
对,就好像‘abc’+1会报错Can't convert 'int' object to str implicitly一样
int和Nint也是不同的类, ...


谢谢了,明白了~这样对以后属性访问,描述符等魔法方法防止递归就容易明白多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 12:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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