Предположим, что у меня есть простой класс Test
, который наследует от numpy.ndarray
(документацию по ndarray
подклассу). Этот класс создает объект, который является частичным видом другого ndarray
. Теперь я хотел бы создать метод, который изменяет этот вид на месте. Что-то вроде:
import numpy
class Test(numpy.ndarray):
def __new__(cls, info='Test class'):
base = numpy.ndarray.__new__(cls, (6, 2), dtype=float)
view = base[0:2, :]
view.info = info
return view
def __array_finalize__(self, obj):
if obj is None:
return
self.info = getattr(obj, 'info', None)
def change_view(self, start, stop):
"""This is the method I'd like to implement"""
# Incorrect, but represents what I am looking for
self = self.base[start:stop]
if __name__ == '__main__':
t = Test()
print(t)
print(t.info)
t.change_view(1, 5)
print(t)
print(t.info)
Я бы ожидал, что метод .change_view(x)
изменит представление атрибута .base
, чтобы показать строки [1:5]
вместо [0:2]
, который по умолчанию используется в __new__()
.
Возможно ли это? Если да, то как? В противном случае, почему бы и нет? Обратите внимание, что .base
никогда не изменяется (он всегда занимает одно и то же пространство памяти), я просто хочу изменить его вид.
Примечания
- См. комментарии в
change_view()
. Я знаю, чтоself = self.base[start:stop]
неверен, и я знаю и понимаю, почему, но я думаю, что это короткий способ представить то, что я ищу. - Как отмечено в ответах ниже, можно подумать о
self[:] = ...
илиself.data = ...
. Однако это не сработает при изменении размера представления (что точно так).
Ссылки
Этот вопрос был уже задан здесь (или, по крайней мере, это аналогичный случай), но ответы касались решений, которые возвратили модифицированный массив (т.е. не на месте модификация) или который использовал объект-оболочку (т.е. имеющий атрибут с массивом, который должен быть изменен).
Я знаю эти возможности, и я знаю, что они могут быть проще или даже более удобными. Однако я хотел бы понять, почему (если это так) невозможно выполнить то, что я ищу.