подкласс numpy не будет принимать аргументы для __new__ от класса, наследуемого по python - PullRequest
2 голосов
/ 27 января 2012

Я создал подкласс ndarray под названием «Parray», который принимает два аргумента: p и размерность. Он прекрасно работает сам по себе. Теперь я хочу создать класс с именем SirPlotsAlot, который наследует Parray без всяких причудливых new и array_finalize и т. Д.

import numpy as np

class Parray(np.ndarray):
    def __new__(self, p = Parameters(), dimensionality = 2):

        print "Initializing Parray with initial dimensionality %s..." % dimensionality

        self.p = p # store the parameters

        if dimensionality == 2:
            shape = (p.nx, p.ny)
            self.pshape = shape
        elif dimensionality == 3:
            shape=(p.nx, p.ny, p.nx)
            self.pshape = shape
        else:
            raise NotImplementedError, "dimensionality must be 2 or 3"

        # ...Set other variables (ellided)

        subarr = np.ndarray.__new__(self, shape, dtype, buffer, offset, strides, order)
        subarr[::] = np.zeros(self.pshape) # initialize to zero
        return subarr
...

class SirPlotsAlot(Parray):
    def __init__(self, p = Parameters(), dimensions = 3):
        super(SirPlotsAlot, self).__new__(p, dimensions)     # (1)

Объекты в моей программе совместно используют наборы параметров, передавая объект p = Parameters () вперед и назад.

Теперь, когда я печатаю (это файл вспомогательный.py):

import auxiliary
from parameters import Parameters
p = Parameters()
s = auxiliary.SirPlotsAlot(p, 3)

ожидая получить «инициализацию Parray с начальной размерностью 3», вместо этого я получаю «2». НО если я наберу:

import auxiliary
s = auxiliary.SirPlotsAlot()

Я получаю

---> 67             shape = (p.nx, p.ny)
"AttributeError: 'int' object has no attribute 'nx'"

Он думает, что "p" - это int, а это не так. Я могу получить много странных, казалось бы, не связанных ошибок, если поиграюсь с этим. Инт это думает, что это "2". Я полностью потерян.

Я пробовал с комментарием # (1) и без него (супер звонок).

Другие ошибки при воспроизведении включают «AttributeError: объект списка» не имеет атрибута «p» »,« TypeError: new () принимает ровно 2 аргумента (1 дан) »,« ValueError: need «распаковывать более 0 значений» (я заменил аргументы new на * args, чего я не очень хорошо понимаю).

1 Ответ

1 голос
/ 27 января 2012

Я собираюсь повторить kindal и сказать "не используйте __new__".Ваш Parray.__new__ метод больше похож на инициализацию и должен использовать __init__, как его подкласс.

...