l******y 发帖数: 182 | 1 对于如下class
class A(object):
def __init__(self, x):
self.x = x
...
def __iand__(self, other):
self.x += other.x
# return self
为什么在__iand__中最后的return是需要的?感觉这个class算是mutable的,那么如果
执行如下代码:
a1 = A(1)
a2 = A(2)
a1 += a2
感觉上应该是把a1的reference a1.x bound到1+2=3上。但如果没有那个return, 最后
a1却变成了None。这个是为什么?
谢谢指点! |
x********q 发帖数: 108 | 2 首先有个typo,应该是iadd吧。如果不return self,就是return None。__iadd__在见
到+=时被调用,绑定参数a, b.但是赋值给a由+=完成。结果a被设定为None。 |
d******e 发帖数: 2265 | 3 this is for chaining
【在 l******y 的大作中提到】 : 对于如下class : class A(object): : def __init__(self, x): : self.x = x : ... : def __iand__(self, other): : self.x += other.x : # return self : 为什么在__iand__中最后的return是需要的?感觉这个class算是mutable的,那么如果 : 执行如下代码:
|
l******y 发帖数: 182 | 4 是typo, 应该是__iadd__.
不过我还是不太理解。在__iadd__里,我直接修改了self.x的值。那么相对应的,也应
该仅仅是a1所绑定的object的x被修改了,而a1本身还是应该绑定在原来那个object上
。如果我没记错的话,在java里做类似操作不会导致这个问题。这是不是跟python是动
态语言有关?
谢谢!
【在 x********q 的大作中提到】 : 首先有个typo,应该是iadd吧。如果不return self,就是return None。__iadd__在见 : 到+=时被调用,绑定参数a, b.但是赋值给a由+=完成。结果a被设定为None。
|
j******o 发帖数: 4219 | 5 python所有的函数默认有一个return,如果你不写,那就是return None。
你把a1 += a2拆成a1 = a1+a2来看,return在这里是个问题了。 |
l******y 发帖数: 182 | 6 大概明白了,多谢!
【在 j******o 的大作中提到】 : python所有的函数默认有一个return,如果你不写,那就是return None。 : 你把a1 += a2拆成a1 = a1+a2来看,return在这里是个问题了。
|
x********q 发帖数: 108 | 7 我是这么理解的,python解释+=为绑定iadd,然后进行=,两个操作是“atomic”的。
iadd确实update了a,但是赋值更新为None. 加print,把id或address也打出来,应该
能看到变化。
【在 l******y 的大作中提到】 : 是typo, 应该是__iadd__. : 不过我还是不太理解。在__iadd__里,我直接修改了self.x的值。那么相对应的,也应 : 该仅仅是a1所绑定的object的x被修改了,而a1本身还是应该绑定在原来那个object上 : 。如果我没记错的话,在java里做类似操作不会导致这个问题。这是不是跟python是动 : 态语言有关? : 谢谢!
|
s*********d 发帖数: 94 | 8 __iadd__,这个叫operator overloading,什么意思呢?
numer 是一个class, ‘ + ’ 表示2个数的和
string 是一个class ,‘ + ’ 表示把两个字符串联接起来
你现在自己定义了一个新的class,叫 A, 那你怎么对这个新的class的object操作呢?
你在 class A的定义里用 __iadd__重新定义了‘ + ’的意义。根据自己的这个定
义,你用‘+’操作A的object就是操作object的x attribute,把结果用 return self
返还, self再调用 __str__。所以你这个A的定义中还有:def __str__: return str(
self.x)
【在 l******y 的大作中提到】 : 对于如下class : class A(object): : def __init__(self, x): : self.x = x : ... : def __iand__(self, other): : self.x += other.x : # return self : 为什么在__iand__中最后的return是需要的?感觉这个class算是mutable的,那么如果 : 执行如下代码:
|
l******y 发帖数: 182 | |