Python 是否将属性getter和setter用于项分配?

Python 是否将属性getter和setter用于项分配?,python,python-3.x,python-decorators,Python,Python 3.x,Python Decorators,我正在处理一个类,该类应该在设置一个特定成员时更新成员。更改\u bar1时更新\u bar2的一个简单示例: class foo: def __init__(self, *args): self._bar1 = args[0] self._bar2 = args[1] @property def bar1(self): return self._bar1 @bar1.setter def bar1(se

我正在处理一个类,该类应该在设置一个特定成员时更新成员。更改
\u bar1
时更新
\u bar2
的一个简单示例:

class foo:
    def __init__(self, *args):
        self._bar1 = args[0]
        self._bar2 = args[1]

    @property
    def bar1(self):
        return self._bar1

    @bar1.setter
    def bar1(self, val):
        self._bar1 = val
        self._bar2 += self._bar1
但是如果
\u bar1
(也可能是
\u bar2
)的类型支持项目分配(例如NumPy数组),并且只有一些项目需要更改,该怎么办?换句话说,我如何更改代码以使其正常工作:

import numpy as np
a = np.random.rand(3)
c = foo(a, 2)
c.bar1[0] = 1.
到目前为止,我只找到了包
indexedproperty
,它可以通过pip安装,似乎完全符合我的要求。但是,出于几个原因,我不希望库需要“非标准”包?有人知道另一种方法吗? 因此,我希望做到这一点:

class foo:
# (...)
    def set_bar1(self, idx, val):
        self._bar1[idx] = val
        self._bar2 += self._bar1
# (...)
c.set_bar1(2, 3.)
但使用直接项目分配,即

c.bar1[2] = 3.

在对从属性检索到的值进行变异时,根本不涉及类。要实现这一点,您必须编写一个getter,返回值的包装版本,并使用重写的方法在值发生变化时将更改应用于原始对象。该类可能不应公开其实现细节。与其设置
c.bar1[0]
,不如设置
c[0]
@jasonharper如果我理解正确,我必须使
foo
或我的
foo
实例为
\u bar1
类型或包装器所知,并从其他类更改对象。“或者你的意思是别的?”德克塞我想了想。但是我的类已经有了一个
\uuuu getitem\uuu
方法,它可以变异另一个类似数组的成员。我认为
\uuuu setitem\uuuu
方法应该与此一致。