2013-02-21 40 views
3

我有一個使用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?

回答

5

當然。你想覆蓋你的類的__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

1

更多選擇:

,而不是實施新的容器類型,你可以重用,做你想要的,一個什麼樣的現有元組:

self.weights = tuple() 

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

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

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