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

后端 未结 4 1751
故里飘歌
故里飘歌 2020-12-19 18:24

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:



        
相关标签:
4条回答
  • 2020-12-19 19:00
    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
    >>>
    
    0 讨论(0)
  • 2020-12-19 19:06

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

    0 讨论(0)
  • 2020-12-19 19:09

    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
    
    0 讨论(0)
  • 2020-12-19 19:09

    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.

    0 讨论(0)
提交回复
热议问题