终极目标:有isinstance(MyClass(), np.ndarray)
和issubclass(MyClass, np.ndarray)
都返回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
我敢肯定,这是因为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?