4

我有一个使用 Numpy 的项目。其中一个类需要一组称为权重的矩阵。出于多种原因,最好将所有这些矩阵值存储为一个长向量,并让每个单独的矩阵成为其中一部分的视图。

self.weightvector = asmatrix(rand(nweights, 1)) # All the weights as a vector
self.weights = list() # A list of views that have the 'correct' shape

for i in range(...):
    self.weights.append(...)

如果该类的用户执行类似 的操作foo.weights[i] = bar,那么这些权重将不再是原始权重向量的视图。

Python 是否提供了一种机制,通过该机制可以在完成索引等foo.weights[i] = bar操作时定义 getter 和 setter?

4

2 回答 2

5

当然。你想在你的类上覆盖 __setitem__ 方法。

class Weights(list):

    def __setitem__(self, key, value):
         ....

这是文档的链接:http:
//docs.python.org/2/reference/datamodel.html#object.__setitem__

于 2013-02-21T11:59:29.680 回答
1

更多的选择:

除了实现一个新的容器类型,你可以重用现有的做你想做的事,一个元组:

self.weights = tuple()

for i in (...) :
    self.weights += (<new_item>,)

或者,如果您真的想使用列表,请将权重设为 a@property并返回原始列表的副本。

@property
def weights(self) :
    return [j for j in self._weights]
于 2013-02-21T13:50:22.780 回答