0

次のような関数とプロパティを持つ Python クラスがあります。

@property
def xcoords(self):
    ' Returns numpy array. '
    try:
        return self.x_coords
    except:
        self.x_coords = self._read_coords('x')
        return self.x_coords

def _read_coords(self, type):
    # read lots of stuff from big file
    return array

これにより、これを行うことができます: data.xcoords、素晴らしくシンプルです。

これをそのままにしておきたいのですが、これを可能にする関数を定義したいと思います。

    data.xcoords.mm
    data.xcoords.in

どうすればいいのですか?また、これらの関数を、 などのクラスの他のプロパティに対しても機能させたいと考えていdata.zcoords.mmます。

4

1 に答える 1

3

本当に配列xcoordsを返したい場合、人々は の値がandメソッドを持つことを期待しないかもしれません。とが本当に配列自体のプロパティなのか、定義しているクラスのプロパティなのかを考える必要があります。後者の場合、サブクラス化しないことをお勧めします。それらを含むクラスのメソッドとして定義するだけです。numpyxcoordsmmin_mmin_ndarray

一方、これらが確実に によって返されるもののプロパティである場合xcoords、サブクラス化ndarrayは妥当なアプローチです。docs で説明されているように、 __new__andを定義して正しく取得してください。__array_finalize__

をサブクラス化する必要があるかどうかを判断するにはndarray、このクラスをプログラムの他の場所で再利用できるかどうかを検討してください。(今のところ、他の場所で実際に使用する必要はありません。ある時点で再利用している自分を見ることができればよいのです。) できない場合、これらはおそらくそれを含むクラスのプロパティです。ここでの推論の行は、関数の観点から考えると、短い関数fooと短い関数があり、それらを 以外の方法で決してbar呼び出さないことがわかっている場合は、代わりに書く方がよいかもしれないということです。クラスにも同じロジックが適用されます。foo(bar(x))foo_bar

最後に、larsmans が指摘したようにin、Python のキーワードであるため、この場合は使用できません (これがin_上記で使用した理由です)。

于 2012-07-23T10:07:36.470 に答える