如何在Cython中使用自定义的metaclass?
下面是我正在尝试编译的cython文件的例子:
foobar.pxd
cdef extern from 'object.h':
ctypedef class __builtin__.type [object PyHeapTypeObject]:
pass
cdef class _A(type):
pass
cdef class A #Forward Declaration
cdef class B(A):
pass
foobar.pyx
cdef class _A(type):
def __init__(metaself, name, **args):
super(_A, metaself).__init__(name, *args)
print name
A = _A('A', (object,), {})
cdef class B(A):
pass
当我尝试编译它们时,出现了一个AnalyseDeclarationsTransform
错误。请问正确的语法是什么,或者有没有什么解决办法?
1 个回答
1
据我所知,扩展类(cdef类)不能使用不是type
的元类。不过,普通类使用cdef元类是完全可以的。我不太确定你想要实现什么,但以下的写法是可以的:
cdef extern from 'object.h':
ctypedef class __builtin__.type [object PyHeapTypeObject]:
pass
cdef class _A(type):
pass
还有
cdef class _A(type):
def __init__(metaself, name, **args):
super(_A, metaself).__init__(name, *args)
print name
A = _A('A', (object,), {})
class B(A): # use a non cdef class
pass
你可以在sage的classcall_metaclass中找到一个实际的例子。