使 类 在 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 时所做的一些小优化,但这是灵活性的权衡。
如果您需要访问 _ABC
的 cdef
属性,请执行以下操作:
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 没问题)
,这将产生运行时错误
我有一个 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 时所做的一些小优化,但这是灵活性的权衡。
如果您需要访问 _ABC
的 cdef
属性,请执行以下操作:
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 没问题)