How to implement “__iadd__()” for an immutable type?

我的梦境 提交于 2019-11-28 05:33:06

问题


I would like to subclass an immutable type or implement one of my own which behaves like an int does as shown in the following console session:

>>> 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

Not surprisingly, int objects have no __iadd__() method, yet applying += to one doesn't result in an error, instead it apparently creates a new int and also somehow magically reassigns it to the name given in the augmented assignment statement.

Is it possible to create a user-defined class or subclass of a built-in immutable one that does this, and if so, how?


回答1:


The return value of __iadd__() is used. You don't need to return the object that's being added to; you can create a new one and return that instead. In fact, if the object is immutable, you have to.

import os.path

class Path(str):
    def __iadd__(self, other):
        return Path(os.path.join(str(self), str(other)))

path = Path("C:\\")
path += "windows"

print path



回答2:


Simply don't implement __iadd__, but only __add__:

>>> class X(object):
...     def __add__(self, o):
...             return "added"
>>> x = X()
>>> x += 2
>>> x
'added'

If there's no x.__iadd__, Python simply calculates x += y as x = x + y doc.




回答3:


When it sees i += 1, Python will try to call __iadd__. If that fails, it'll try to call __add__.

In both cases, the result of the call will be bound to the name, i.e. it'll attempt i = i.__iadd__(1) and then i = i.__add__(1).




回答4:


class aug_int:
    def __init__(self, value):
        self.value = value

    def __iadd__(self, other):
        self.value += other
        return self

>>> i = aug_int(34)
>>> i
<__main__.aug_int instance at 0x02368E68>
>>> i.value
34
>>> i += 55
>>> i
<__main__.aug_int instance at 0x02368E68>
>>> i.value
89
>>>


来源:https://stackoverflow.com/questions/11836570/how-to-implement-iadd-for-an-immutable-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!