gpt4 book ai didi

python - 如何为 Python 属性实现 __iadd__

转载 作者:太空狗 更新时间:2023-10-29 17:31:40 25 4
gpt4 key购买 nike

我正在尝试创建一个 Python 属性,其中就地添加是通过与检索值、添加另一个值和重新分配不同的方法来处理的。因此,对于对象 o 上的属性 x

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__ 以某种方式绕过了它。

我该怎么做?我不明白描述符的意义吗?我需要元类吗?

最佳答案

__iadd__ 只会根据 __get__ 返回的值进行查找。您需要使用 __iadd__ 使 __get__(或属性 getter)返回一个对象(或代理对象)。

@property
def x(self):
proxy = IProxy(self._x)
proxy.parent = self
return proxy

class IProxy(int, object):
def __iadd__(self, val):
self.parent.iadd_x(val)
return self.parent.x

关于python - 如何为 Python 属性实现 __iadd__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com