「Parray」と呼ばれるndarrayのサブクラスを作成しました。これは、pと次元の2つの引数を取ります。それ自体は正常に動作します。ここで、SirPlotsAlotというクラスを作成します。このクラスは、派手なnewやarray_finalizeなどを一切使用せずにParrayを継承します。
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()を前後に渡すことにより、パラメーターのセットを共有します。
今、私がタイプすると(ファイルはauxiliary.pyです):
import auxiliary
from parameters import Parameters
p = Parameters()
s = auxiliary.SirPlotsAlot(p, 3)
素敵な「初期次元3の初期化Parray」を期待して、代わりに「2」を取得します。しかし、私が入力した場合:
import auxiliary
s = auxiliary.SirPlotsAlot()
私は得る
---> 67 shape = (p.nx, p.ny)
"AttributeError: 'int' object has no attribute 'nx'"
「p」はintであると考えていますが、そうではありません。それをいじってみると、一見無関係に見える奇妙なエラーがたくさん発生する可能性があります。それが「2」であると考えるint。私は完全に迷子になっています。
#(1)コメント(スーパーコール)の有無にかかわらず試してみました。
遊んでいる他のエラーには、「AttributeError:'list'オブジェクトには属性'p'がありません」、「TypeError:new()は正確に2つの引数を取ります(1つ指定)」、「ValueError:解凍するには0を超える値が必要です」(I新しい's引数を*argsに置き換えました。これは私がよく理解していないことです)。