我有一个简单的基于基类的继承树,在这里我需要从派生类的实例中调用基类的方法之一:
cdef class base:
cdef void nop(self):
pass
cdef class derived(base):
cpdef void nop(self):
super(derived, self).nop()
pass
如果我导入已编译的模块并尝试执行
d = derived()
d.nop()
我收到以下运行时错误:
AttributeError: 'super' object has no attribute 'nop'
如果我用cpdef
这个基数的方法,错误消失了,这使我认为如果不通过python,我想做的事情是不可能的。
是这样吗如果我需要基类的方法是纯c的,是否可以从派生类中调用基类的方法?
(请考虑到我对cython还是很陌生,可能会误解了cdef和cpdef之间的区别。关键是我需要这段代码尽可能快。)
Cython 0.29.14 Python 3.7.4
答案 0 :(得分:-1)
super
的问题在于,它在很大程度上被视为返回通用Python对象的Python函数,该对象必须在运行时进行处理。 cdef
方法仅在Cython在编译时知道类型时可用,因此无法从super
的结果访问它们。 (可以说,Cython的智能版本可能应该能够在这种情况下解决它……)
幸运的是,还有另一种方法illustrated in the Cython documentation:您只需要显式调用基类方法(无需通过super
进行内省)。就您而言
base.nop(self)
缺少super
不会给您带来麻烦,因为cdef class
的继承受到了严格的限制(来自另一个cdef class
的单个继承),因此您不必面对super
涉嫌的复杂情况。