3

不変型をサブクラス化するか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

当然のことながら、intオブジェクトには__iadd__()メソッドがありませんが、オブジェクトに適用+=してもエラーは発生しません。代わりに、オブジェクトが新しいものintを作成し、拡張代入ステートメントで指定された名前に魔法のように再割り当てします。

これを行う組み込みの不変クラスのユーザー定義クラスまたはサブクラスを作成することは可能ですか?作成する場合は、どのように行いますか?

4

4 に答える 4

15

単に実装しないでください__iadd__、しかしただ__add__

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

がない場合x.__iadd__、Pythonは単にdocx += yとして計算します。x = x + y

于 2012-08-06T22:03:32.860 に答える
3

が表示されるとi += 1、Pythonはを呼び出そうとします__iadd__。それが失敗した場合は、を呼び出そうとします__add__

どちらの場合も、呼び出しの結果は名前にバインドされます。つまり、試行i = i.__iadd__(1)してからi = i.__add__(1)

于 2012-08-06T22:05:25.727 に答える
2

の戻り値__iadd__()が使用されます。追加されるオブジェクトを返す必要はありません。新しいものを作成して、代わりにそれを返すことができます。実際、オブジェクトが不変である場合は、そうする必要があります。

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
于 2012-08-06T22:26:13.283 に答える
-1
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
>>>
于 2012-08-06T22:15:19.077 に答える