最终目标:让isinstance(MyClass(), np.ndarray)和issubclass(MyClass, np.ndarray)都返回True而没有MyClass调用np.ndarray.__new__()。假设我已经实现了numpy.ndarray的所有方法,并且我想对其进行设置,以便它可以通过isinstance对ndarray的检查,但是我不希望它实际从__new__调用ndarray >。最初,我在想这样的事情:import numpy as npclass 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类)中,并使用多重继承来使类型检查工作而无需调用。所以我的课是:类MyClass(BlockingClass,np.ndarray):    通过其中__new__是c定义的函数。我确实更愿意在Cython中执行此操作,但是我不知道如何使它工作。我试着做:cdef class BlockingClass: def __new__(cls, *args, **kwargs): return object.__new__(cls)但这会产生与BlockingClass相同的“不安全”错误。cdef class BlockingClass: def __cinit__(self, *args, **kwargs): # do stuff return self但是,当__cinit__像上面定义的对象那样具有多个继承的子继承时,该BlockingClass方法仍然被调用。如果我无法在Cython中执行此操作,那么定义一个通过多重继承跳过__new__的__new__的基类所需的最少C代码量是多少?也许我可以导入一个函数来实例化该类而不用增加mro? 最佳答案 我不知道是否可以伪造isinstance和issubclass,但是在以下方法中,您可以定义仅将所需参数传递给np.ndarray.__new__的类:import numpy as npclass BlockingClass(np.ndarray): def __new__(cls, *args, **kwargs): ndarray_kw = ['shape', 'dtype', 'buffer' 'offset', 'strides', 'order'] to_ndarray = {} to_myclass = {} for k,v in kwargs.items(): if k not in ndarray_kw: to_myclass[k] = v else: to_ndarray[k] = v new = np.ndarray.__new__(cls, *args, **to_ndarray) for k,v in to_myclass.items(): setattr(new, k, v) return new def __init__(self, *args, **kwargs): self.test = 1 self.args = args self.kwargs = kwargs关于python - 跳过ndarray子类中的numpy __new__(或者可能重写/定义C或cython中的类),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18284660/
10-12 21:22