鱼C论坛

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

[技术交流] 对小甲鱼python视频第42讲不解的地方

[复制链接]
发表于 2024-10-11 20:32:41 | 显示全部楼层 |阅读模式

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

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

x
class New_int(int):
    def __add__(self,other):
        return int.__sub__(self,other)
    def __sub__(self,other):
        return int.__add__(self,other)

a = New_int(3)
b = New_int(5)

a + b = -2
这里我想问下, 这里说a + b = -2,  为何a与b做加法时, 其class New_int中的def __sub__(self,other)函数不会被执行?  作为class New_int中的函数, 应该也被执行才对。那位大神可以给个解释?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-11 20:32:46 | 显示全部楼层
在这个例子中,`a + b` 之所以计算结果是 `-2`,是因为你在 `New_int` 类中覆盖了 `__add__` 方法,并让它调用了 `__sub__` 方法。具体来说:

1. 当你执行 `a + b` 时,Python调用的是 `a` 的 `__add__` 方法。
2. 由于在 `New_int` 类中,你重写了 `__add__` 方法,让它执行的是 `int.__sub__(self, other)`。
3. 因此,执行的结果是 `3 - 5`,所以得到 `-2`。

而 `__sub__` 方法在这种情况下并不会被调用,因为它只是在调用减法(`a - b`)时才会被触发。

总结:你重写了加法(`__add__`)的方法,使它执行的是减法逻辑,自然会出现这样的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-11 20:36:08 | 显示全部楼层
FishC 发表于 2024-10-11 20:32
在这个例子中,`a + b` 之所以计算结果是 `-2`,是因为你在 `New_int` 类中覆盖了 `__add__` 方法,并让它 ...

针对第一点答复, “当你执行 `a + b` 时,Python调用的是 `a` 的 `__add__` 方法“
为和a+ b python 会调用是 `a` 的 `__add__` 方法, python是如何识别的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-11 20:36:16 | 显示全部楼层
鬼少 发表于 2024-10-11 20:36
针对第一点答复, “当你执行 `a + b` 时,Python调用 ...


在 Python 中,当你使用 `+` 运算符进行对象相加时,Python 会自动调用被加对象的 `__add__` 方法来执行该操作。这是因为 Python 对象遵循“魔法方法”机制,这些方法以双下划线开头和结尾,提供了一种重载运算符的方式。

具体到这个例子,当你写 `a + b` 时:

1. Python 首先检查 `a` 对象的类型,看它是否有 `__add__` 方法。
2. 因为 `a` 是 `New_int` 类的实例,而你在 `New_int` 中重写了 `__add__` 方法,所以 Python 会调用这个方法。

如果 `a` 没有 `__add__` 方法,Python 会接着检查 `b` 是否实现了 `__radd__` 方法作为备用。在这里,因为 `a` 有 `__add__` 方法,所以直接调用,而不查找 `b` 的 `__radd__` 方法。

通过这种机制,Python 实现了运算符的多态性,使得可以根据不同的对象类型自定义运算结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-11 20:59:37 | 显示全部楼层
int.__sub__(self,other),他这里执行的是 int 类型的 __sub__(self,other),而非 New_int 的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-11 21:01:47 | 显示全部楼层
FishC 发表于 2024-10-11 20:36
在 Python 中,当你使用 `+` 运算符进行对象相加时,Python 会自动调用被加对象的 `__add__` 方法来执 ...

当执行 a = New_int(3)时, 为何a = 3 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-11 21:01:55 | 显示全部楼层
鬼少 发表于 2024-10-11 21:01
当执行 a = New_int(3)时, 为何a = 3 ?


当你执行 `a = New_int(3)` 时,实际上发生了以下过程:

1. **调用构造函数**: `New_int(3)` 创建一个 `New_int` 类型的实例。由于 `New_int` 继承自 `int`,它使用了 `int` 类的构造函数。

2. **存储值**: `int` 的构造函数会接收参数 `3`,并将其存储为不可变的整数值。

3. **赋值操作**: 然后,这个 `New_int` 对象被赋给变量 `a`。尽管 `a` 是一个 `New_int` 类的实例,但它仍然保持了整数值 `3` 的特性,因为 `New_int` 继承自 `int`。

因此,`a` 表现得像整数 `3`,但它的类型是 `New_int`,这使得它能够使用 `New_int` 类中定义的特殊行为(如重载后的 `__add__` 和 `__sub__` 方法)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 13:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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