mar*_*eau 3 python immutability augmented-assignment
我想继承一个不可变类型或实现我自己的类型,其行为类似于int以下控制台会话中显示的:
>>> i=42
>>> id(i)
10021708
>>> i.__iadd__(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'
>>> i += 1
>>> i
43
>>> id(i)
10021696
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,int对象没有__iadd__()方法,但是应用于+=一个不会导致错误,相反它显然会创建一个新的int,并且不知何故神奇地将它重新分配给扩充赋值语句中给出的名称.
是否可以创建一个用户定义的类或内置不可变类的子类,如果是这样,如何?
phi*_*hag 14
只是不实施__iadd__,但仅限于__add__:
>>> class X(object):
... def __add__(self, o):
... return "added"
>>> x = X()
>>> x += 2
>>> x
'added'
Run Code Online (Sandbox Code Playgroud)
如果没有x.__iadd__,Python只计算x += y为x = x + y doc.