liliya 发表于 2020-4-28 18:25:12

1+b问题

class Nint(int):
        def __radd__(self,other):
                return int.__sub__(self,other)
       
>>> a=Nint(5)
>>> b=Nint(3)
>>> a+b
8
>>> 1+b
2
小甲鱼的讲解时因为1的加法找不到,所以用了b的。那么我有一个问题,1不是个整型类型嘛,为什么它的加法会找不到?
>>> type(1)
<class 'int'>
它的__add__()方法不是应该系统内置好了吗?

zltzlt 发表于 2020-4-28 18:35:11

调用 1.__add__(b) 会出错,所以调用 b 的 __radd__

永恒的蓝色梦想 发表于 2020-4-28 18:37:44

整形只能加整形

liliya 发表于 2020-4-28 18:38:46

zltzlt 发表于 2020-4-28 18:35
调用 1.__add__(b) 会出错,所以调用 b 的 __radd__

为什么会出错?是因为默认的整型的加法里限制了第二个参数的类型吗???

liliya 发表于 2020-4-28 18:40:31

永恒的蓝色梦想 发表于 2020-4-28 18:37
整形只能加整形

是因为int.__add__这个函数内部限制了它对吗?

zltzlt 发表于 2020-4-28 18:41:21

liliya 发表于 2020-4-28 18:38
为什么会出错?是因为默认的整型的加法里限制了第二个参数的类型吗???

刚刚试了一下,的确不会出错,就像之前我说的,假设 a + b,先调用 a.__add__(b),如果 a 没有 __add__ 方法或者在调用 a 的 __add__ 方法时出错了就会调用 b.__radd__(a) 。

特别地,如果 type(b) 是 type(a) 的子类,则优先调用 b.__radd__(a)。

这里 Nint 是 int 的子类,所以优先调用 b 的 __radd__

liliya 发表于 2020-4-28 18:42:56

永恒的蓝色梦想 发表于 2020-4-28 18:37
整形只能加整形

我之前问过说不同类型的数据能否相加,是应该可以进行操作的。至于怎么相加是应该程序员说了算的。整型也可以加浮点型啊。

liliya 发表于 2020-4-28 19:22:29

zltzlt 发表于 2020-4-28 18:41
刚刚试了一下,的确不会出错,就像之前我说的,假设 a + b,先调用 a.__add__(b),如果 a 没有 __add__...

我刚试了一下直接1.__add__(2)报错了SyntaxError: invalid syntax,这是为啥?当我们a=1,b=2的时候我们去a.__add__(b)是没有问题的,但是直接1.__add__(2)是报错的。是不是只有我们a=1,b=2这个过程才是真的实现了类的实例化对他划分。但是奇怪的点是,我们去type(1)/isinstance(1,int)结果都表明它是整型类型,那它是整型类型,却不拥有整型的方法?

zltzlt 发表于 2020-4-28 20:11:42

liliya 发表于 2020-4-28 19:22
我刚试了一下直接1.__add__(2)报错了SyntaxError: invalid syntax,这是为啥?当我们a=1,b=2的时候我们去 ...

试试 (1).__add__(2)

liliya 发表于 2020-5-3 11:18:22

zltzlt 发表于 2020-4-28 18:41
刚刚试了一下,的确不会出错,就像之前我说的,假设 a + b,先调用 a.__add__(b),如果 a 没有 __add__...

大佬大佬,能不能解决我个问题
页: [1]
查看完整版本: 1+b问题