2

「Parray」と呼ばれるndarrayのサブクラスを作成しました。これは、pと次元の2つの引数を取ります。それ自体は正常に動作します。ここで、SirPlotsAlotというクラスを作成します。このクラスは、派手なnewarray_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に置き換えました。これは私がよく理解していないことです)。

4

2 に答える 2

1

私は親切に反響し、「使用しないでください」と言います__new__。あなたのParray.__new__メソッドは初期化のように見え、__init__サブクラスのように を使用する必要があります。

于 2012-01-26T23:28:30.443 に答える