У меня есть класс в python, который выступает в качестве front-end для c-библиотеки. Эта библиотека выполняет симуляции и обрабатывает очень большие массивы данных. Эта библиотека передает массив ctype
, и моя обертка преобразует его в правильный numpy.ndarray
.Как реализовать массив-оболочку свойств в python?
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
, который был бы более удобным для чтения и имеют меньше переменных , Я не совсем точно знаю, как создать такую оболочку (у меня очень мало опыта в создании классов/функций оболочки), который имитирует свойства, но позволяет доступ к элементу в качестве моего примера.
Как я могу сделать такой класс обертки? Есть ли лучший способ достичь этой цели? Если у вас есть какие-либо советы или чтение, которые могли бы помочь, я был бы очень признателен.
Да, я думаю, что в конце концов это может сработать. Я попытался сделать такой класс, но проблема с этим методом заключается в том, что вы теряете все преимущества наличия ndarray. Например, 'a.shape' не будет работать, потому что вам действительно нужно' a.np_array.shape'. Я попытался наследовать от 'numpy.ndarray', но мои попытки не удались. Вы знаете, как можно это сделать? – scicalculator
Добавлен код делегирования. Теперь 'a.shape' должен предоставить' a.np_array.shape'. –
Конечно, перенаправление '__getattr__' именно то, что я должен был делать ¥. Большое спасибо за идеи! – scicalculator