由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教一个python的概念问题
相关主题
array如何get set?newbie python question
return value of a python function...没人觉得python的string是immutable不爽吗?
问个Python的问题Python Q: function pass in struct pointer, come back with data filled
a python questionpython 区别于其他语言的根本?
问个c++问题int &x=y;的问题
python 可以给class动态添加method吗?初级问题:Python怎么指代上一个命令的输出 (转载)
const in c++求教python问题,在线等 (转载)
这么说吧,fp不是否定变量,而是控制变量的范围R已经是第六大语言了....
相关话题的讨论汇总
话题: __话题: a1话题: iadd话题: return话题: class
进入Programming版参与讨论
1 (共1页)
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
9
多谢各位的回复
1 (共1页)
进入Programming版参与讨论
相关主题
R已经是第六大语言了....问个c++问题
python还是有些傻傻的行为的python 可以给class动态添加method吗?
How to initialize object in constructor?const in c++
copy constructor问题。这么说吧,fp不是否定变量,而是控制变量的范围
array如何get set?newbie python question
return value of a python function...没人觉得python的string是immutable不爽吗?
问个Python的问题Python Q: function pass in struct pointer, come back with data filled
a python questionpython 区别于其他语言的根本?
相关话题的讨论汇总
话题: __话题: a1话题: iadd话题: return话题: class