Я создал подкласс 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, чего я не очень хорошо понимаю).