如何在Cython中使用自定义的metaclass?

2 投票
1 回答
842 浏览
提问于 2025-04-18 07:46

下面是我正在尝试编译的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中找到一个实际的例子。

撰写回答