最终目标: have isinstance(MyClass(), np.ndarray)
and issubclass(MyClass, np.ndarray)
both return True
without MyClass
call 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
我很确定这是因为它ndarray
是一个 C 类,所以我正在考虑在 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?