Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Почему нельзя перегрузить конструктор numpy.ndarray?

#python #python_3x #numpy


class A(numpy.ndarray):
     def __init__(self,x,y):
         print ('Конструктор')

a = A(2,3)


Выдаёт ошибку : TypeError: data type not understood
Если использовать один параметр.

class A(numpy.ndarray):
     def __init__(self,x):
         print ('Конструктор')

a = A(2)


То всё нормально, будет напечатано конструктор. Если нет параметров

class A(numpy.ndarray):
     def __init__(self):
         print ('Конструктор')

a = A()


То будет ошибка : TypeError: Required argument 'shape' (pos 1) not found
Почему нельзя перегрузить конструктор numpy.ndarray
    


Ответы

Ответ 1



В документации сказано, что при перегрузке конструктора ndarray начинать необходимо с реализации метода __new__, так как там происходит большая часть работы по инициализации массива вопреки обычному __init__. Вот простой пример из документации, где описаны три рекомендуемых метода, необходимых для инициализации: import numpy as np class C(np.ndarray): def __new__(cls, *args, **kwargs): print('In __new__ with class %s' % cls) return super(C, cls).__new__(cls, *args, **kwargs) def __init__(self, *args, **kwargs): # in practice you probably will not need or want an __init__ # method for your subclass print('In __init__ with class %s' % self.__class__) def __array_finalize__(self, obj): print('In array_finalize:') print(' self type is %s' % type(self)) print(' obj type is %s' % type(obj)) Там же приведены более расширенные примеры и подробное описание ролей каждого из методов-этапов конструктора.

Комментариев нет:

Отправить комментарий