4

Numpy を使用するプロジェクトがあります。クラスの 1 つは、重みと呼ばれる行列のセットを必要とします。いくつかの理由から、これらすべての行列値を 1 つの長いベクトルとして格納し、それぞれの個別の行列をそのスライスのビューにするのが最善です。

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が行われたときにゲッターとセッターを定義できるメカニズムを提供していますか?

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 に答える