作为列表/元组行事的setter和getters

问题描述:

我有一个使用Numpy的项目。其中一个类需要一组称为权重的矩阵。出于以下几个原因,如果我将所有这些矩阵值存储为一个长向量,并且让每个单独的矩阵成为该切片的视图,那么最好。作为列表/元组行事的setter和getters

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?

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

class Weights(list): 

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

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

+1

如果从继承'list'您可能还需要考虑覆盖'__setslice__',请参阅[文档](http://docs.python.org/2/reference/datamodel.html#additional-方法换仿真-的序列类型)。 – Jaime 2013-02-21 13:32:57

更多选择:

,而不是实施新的容器类型,你可以重用,做你想要的,一个什么样的现有元组:

self.weights = tuple() 

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

或者,如果你真的想用一个列表,使权重@property并返回原始列表的副本。

@property 
def weights(self) : 
    return [j for j in self._weights]