インプレース追加が値の取得、別の値の追加、再割り当てとは異なる方法で処理されるPythonプロパティを作成しようとしています。したがって、x
オブジェクトのプロパティの場合o
、
o.x += 5
動作が異なるはずです
o.x = o.x + 5
人々の期待を混乱させないために、の値はo.x
最終的に同じである必要がありますが、インプレース追加をより効率的にしたいと思います。(実際には、単純な加算よりも操作にかなりの時間がかかります。)
私の最初のアイデアは、クラスで、
x = property(etc. etc.)
x.__iadd__ = my_iadd
しかし、これはAttributeErrorを発生させます。これは、おそらくproperty
実装__slots__
?
次の試みでは、記述子オブジェクトを使用します。
class IAddProp(object):
def __init__(self):
self._val = 5
def __get__(self, obj, type=None):
return self._val
def __set__(self, obj, value):
self._val = value
def __iadd__(self, value):
print '__iadd__!'
self._val += value
return self
class TestObj(object):
x = IAddProp()
#x.__iadd__ = IAddProp.__iadd__ # doesn't help
>>> o = TestObj()
>>> print o.x
5
>>> o.x = 10
>>> print o.x
10
>>> o.x += 5 # '__iadd__!' not printed
>>> print o.x
15
ご覧のとおり、特別な__iadd__
メソッドは呼び出されません。__getattr__
オブジェクトがどういうわけかそれをバイパスしていると推測しますが、これがなぜであるかを理解するのに苦労しています。
これどうやってするの?記述子のポイントを取得していませんか?メタクラスが必要ですか?