最終的な目標: haveisinstance(MyClass(), np.ndarray)
とissubclass(MyClass, np.ndarray)
both がを呼び出さTrue
ずに 返されます。MyClass
np.ndarray.__new__()
のすべてのメソッドを実装したとしましょう。 のチェックにnumpy.ndarray
合格するように設定したいのですが、実際にはから呼び出したくありません。isinstance
ndarray
__new__
ndarray
当初、私は次のようなことを考えていました。
import numpy as np
class BlockingClass(np.ndarray):
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
残念ながら、インスタンス化しようとすると、Dummy()
安全ではないというエラーが発生します。
TypeError: object.__new__(Dummy) is not safe, use numpy.ndarray.__new__()
これは、オブジェクトをサブクラス化するクラスである場合に機能します。
class BlockingClass2(object):
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
BlockingClass2() # No error
がCクラスであるためだと確信しているのでndarray
、Cクラス(または、できればCythonクラス)でオーバーライドし、多重継承を使用して、を呼び出さずにタイプチェックを機能させることを考えていました__new__
。したがって、私のクラスは次のようになります。
クラス MyClass(BlockingClass, np.ndarray): パス
BlockingClass
c で定義された関数はどこにありますか。代わりにCythonでこれを行うことを本当に望んでいますが、それを機能させる方法がわかりません。私はやってみました:
cdef class BlockingClass:
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
しかし、これは と同様に同じ「安全でない」エラーを生成し__cinit__
ます。
cdef class BlockingClass:
def __cinit__(self, *args, **kwargs):
# do stuff
return self
ただし、BlockingClass
上記のように を定義するオブジェクトを使用して多重継承でサブクラス化すると__new__
、その__new__
メソッドは引き続き呼び出されます。Cython でこれを行うことができない場合、多重継承によって をスキップする基本クラスを定義するために必要な C コードの最小量はどれくらいndarray
です__new__
か? 関数を cimport して、mro を使わずにクラスをインスタンス化できるのではないでしょうか?