非凡 发表于 2021-6-11 00:18:33

关于对象的一个不解。

本帖最后由 非凡 于 2021-6-11 00:24 编辑

class New_int(int):
    def __add__(self, other):
      return int.__add__(self,other) *2
>>>a = New_int('11')
>>>a + 1
24
>>>a + 11
44
>>>a + 0
22


不解为什么做的上述加法。
视乎把a加的那个整数,像是作为了New_int()参数后返回了一个*2的整数。

不应该是a+1 ,返回的值为,23(22+1)
a+11    返回值11*2+11

>>> b = 1
>>> a + b
24
>>> b + a
12
同样疑惑,为什么 a + b返回值是24,不是 23,b不是赋值为1 吗、?

Twilight6 发表于 2021-6-11 00:34:30


不解为什么做的上述加法。
视乎把a加的那个整数,像是作为了New_int()参数后返回了一个*2的整数。

因为你重新定义了 __add__ 魔法方法,此时你若对该 New_int 类的实例对象 调用 + 号时,会自动调用__add__ 魔法方法

而你重写的 __add__ 魔法方法直接调用父类 int 的 魔法方法,且调用后将其乘以 2,所以最后返回是和之和的二倍值

你要知道 此时 self 是指 + 号左边的对象 a ,而 other 是指 + 号右边的对象 1

简单来说就是先进行了 int.__add__ 对 a + 1 ,然后再执行 * 2,因为前者是一个方法,即函数,我们若要计算就需要得到前者函数的返回值,即 int.__add__ 这个函数方法的返回值

或者用括号来表示下优先级:[int.__add__(self,other)] * 2

非凡 发表于 2021-6-11 00:47:48

本帖最后由 非凡 于 2021-6-11 00:50 编辑

Twilight6 发表于 2021-6-11 00:34
因为你重新定义了 __add__ 魔法方法,此时你若对该 New_int 类的实例对象 调用 + 号时,会自动调用   ...

简单来说就是先进行了 int.__add__ 对 a + 1 ,然后再执行 * 2,因为前者是一个方法,即函数,我们若要计算就需要得到前者函数的返回值,即 int.__add__ 这个函数方法的返回值

或者用括号来表示下优先级: * 2
——————————————————————————————————————————————————————
最后这句话,读的有点绕口,没理解什么意思,
不过我按照你说执行了下,
class New_int(int):
    def __add__(self, other):
      return *2
#结果变成了这样
>>>a = New_int('11')
>>>a +1



视乎是 把 a+1 作为了参数带入到了实例化的类a()中

Twilight6 发表于 2021-6-11 07:58:25

非凡 发表于 2021-6-11 00:47
简单来说就是先进行了 int.__add__ 对 a + 1 ,然后再执行 * 2,因为前者是一个方法,即函数,我们若要 ...


我最后的意思是用括号表示优先级,你带入代码干嘛...呃呃呃

你重写的 __add__ 是先执行 int.__add__ ,而 参数中 self 是指加号左边的对象,other 是指加号右边的对象

那么你执行 int.__add__(self,other) 是会将 __add__(self, other) 的 self 和 other 带入到 int.__add__(self,other) 中

那么你先不看 最后的 *2 肯定需要先执行完 int.__add__(self,other),即 int.__add__(a, 1) 计算结果为 12 后计算 *2= 24

非凡 发表于 2021-6-11 15:57:52

Twilight6 发表于 2021-6-11 07:58
我最后的意思是用括号表示优先级,你带入代码干嘛...呃呃呃

你重写的 __add__ 是先执行 int.__add__ ...

非常感谢~{:5_110:}

Twilight6 发表于 2021-6-11 15:58:10

非凡 发表于 2021-6-11 15:57
非常感谢~

{:5_110:}
页: [1]
查看完整版本: 关于对象的一个不解。