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__()方法不是应该系统内置好了吗? 调用 1.__add__(b) 会出错,所以调用 b 的 __radd__ 整形只能加整形 zltzlt 发表于 2020-4-28 18:35
调用 1.__add__(b) 会出错,所以调用 b 的 __radd__
为什么会出错?是因为默认的整型的加法里限制了第二个参数的类型吗??? 永恒的蓝色梦想 发表于 2020-4-28 18:37
整形只能加整形
是因为int.__add__这个函数内部限制了它对吗? 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__ 永恒的蓝色梦想 发表于 2020-4-28 18:37
整形只能加整形
我之前问过说不同类型的数据能否相加,是应该可以进行操作的。至于怎么相加是应该程序员说了算的。整型也可以加浮点型啊。 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)结果都表明它是整型类型,那它是整型类型,却不拥有整型的方法? liliya 发表于 2020-4-28 19:22
我刚试了一下直接1.__add__(2)报错了SyntaxError: invalid syntax,这是为啥?当我们a=1,b=2的时候我们去 ...
试试 (1).__add__(2) zltzlt 发表于 2020-4-28 18:41
刚刚试了一下,的确不会出错,就像之前我说的,假设 a + b,先调用 a.__add__(b),如果 a 没有 __add__...
大佬大佬,能不能解决我个问题
页:
[1]