使 类 在 cython monkey-patchable 中定义

Make classes defined in cython monkey-patchable

我有一个 python 部分用 cython 编写的扩展。我的问题是,如果我在 cython 代码中实例化 python 个对象,猴子补丁似乎被忽略了。

伪代码mymodule.pyx:

cdef class ABC():
    pass    # some methods here...

cdef class DEF():
    def method1(self):
        return ABC(...)

python 代码中猴子补丁的伪代码:

import mymodule as mm

class GHI(mm.ABC):
    pass

mm.ABC_ = mm.ABC
mm.ABC = GHI

def = mm.DEF(...)
ret_val = def.method1(...)

ret_value 的类型是 < class 'mymodule.ABC'> 而不是 GHI

关于如何定义 cython 的任何建议 类 monkey-patchable?

你需要确保 ABC 只是一个模块级变量,而不是 cdef class

cdef class _ABC():
    pass    # some methods here...

ABC = _ABC

然后您可以根据需要重新分配 mm.ABC。这显然消除了 Cython 在初始化 class 时所做的一些小优化,但这是灵活性的权衡。

如果您需要访问 _ABCcdef 属性,请执行以下操作:

cdef class DEF_(): # underscore to avoid using Cython DEF keyword
    def method1(self):
        cdef _ABC inst = ABC(...)
        inst.cdef_attribute = ... # works fine

如果 ABC 的结果不是 _ABC(虽然子 class 没问题)

,这将产生运行时错误