【发布时间】:2021-12-28 13:17:11
【问题描述】:
我正在尝试使用 python 装饰器更改作为矩阵的类属性的某些索引。问题是我不知道如何使用 setter 方法指定索引。我的代码是这样的:
class A():
def __init__(self, N, M):
self.large_matrix = np.zeros(N, M)
self.some_set = [1,2,3]
@property
def matrix(self):
return self.large_matrix[:,self.some_set]
@matrix.setter
def matrix(self,value):
self.large_matrix[:,self.some_set] = value
有了这个类,我想通过访问较小的矩阵来改变大矩阵的某些值,例如:
self.matrix[index] = value
但这不起作用。代码运行不会引发错误,但大矩阵中的值不会改变。 相反,如果我输入
self.matrix = value
它工作得很好。我还应该提到,拥有装饰器是至关重要的,因为属性 self.someset 有时会发生变化。因此,我希望大型矩阵在我不处理的那些索引上保持不变,但我确实需要将它们存储在类中以供以后参考。
我找到的一个解决方案如下:
m = self.matrix.copy()
m[index] = value
self.matrix = m
这可行,但我认为代码会变得慢得多(这是一个因素),并且在代码中的任何地方都进行更改是很费力的。澄清;矩阵需要在类中访问。是否有任何解决方案来更改 @matrix.setter 装饰器和方法,以使代码保持高效并且我不必在任何地方更改代码?
【问题讨论】:
-
如果你把
print()放在两个函数中,那么你应该看到matrix[index] = value运行getter,而不是setter- 得到matrix- 然后它运行[4]值来自getter。唯一的想法是使用__getitme__、__setitem__而不是matrix -
我对您的示例代码感到相当困惑,因为它没有使用属性表示法,这是属性的来源。您是否正在创建
A的实例a = A(5,5)和所有在您的示例中对matrix的引用真的是a.matrix?请把你的例子变成minimal reproducible example。 -
@blckknght 我现在更改了它,为不明确表示歉意。只是为了澄清;在示例中,我在同一个类中调用矩阵来执行计算。
标签: python class oop decorator