4

Cライブラリのフロントエンドとして機能するPythonのクラスがあります。このライブラリは、シミュレーションを実行し、非常に大きなデータ配列を処理します。このライブラリはctype配列を転送し、ラッパーはそれを適切な に変換しますnumpy.ndarray

class SomeClass(object):
    @property
    def arr(self):
        return numpy.array(self._lib.get_arr())

ただし、メモリの問題が発生しないようにするために、ndarray データをライブラリ データとは別に保持しているため、ndarray を変更しても、ライブラリで使用されている実際の配列は変更されません。ただし、同じ形状の新しい配列を渡して、ライブラリが保持している配列を上書きすることはできます。

@arr.setter
def arr(self, new_arr):
    self._lib.set_arr(new_arr.ctypes)

したがって、次のように配列を操作できます。

x = SomeClass()
a = x.arr
a[0] += 1
x.arr = a

私の望みは、構文を単に にできるようにすることx.arr[0] += 1で、これをさらに単純化することです。これにより、読みやすくなり、変数が少なくなります。プロパティを模倣するが、私の例としてアイテムへのアクセスを許可するようなラッパーを作成する方法が正確にはわかりません(ラッパークラス/関数を作成した経験はほとんどありません)。

そのようなラッパークラスを作成するにはどうすればよいですか? この目標を達成するためのより良い方法はありますか? 参考になるアドバイスや読み物があれば、よろしくお願いします。

4

2 に答える 2

0

あなたの記述子は、self._lib通常の操作中にそれを知っていて更新するappendリスト__setitem__のようなクラスのインスタンスを返す必要があると思います__getitem__.

于 2013-06-03T09:00:49.847 に答える