是否可以访问cdef的超类属性?

时间:2019-12-08 20:12:45

标签: python inheritance cython

我有一个简单的基于基类的继承树,在这里我需要从派生类的实例中调用基类的方法之一:

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

1 个答案:

答案 0 :(得分:-1)

super的问题在于,它在很大程度上被视为返回通用Python对象的Python函数,该对象必须在运行时进行处理。 cdef方法仅在Cython在编译时知道类型时可用,因此无法从super的结果访问它们。 (可以说,Cython的智能版本可能应该能够在这种情况下解决它……)

幸运的是,还有另一种方法illustrated in the Cython documentation:您只需要显式调用基类方法(无需通过super进行内省)。就您而言

base.nop(self)

缺少super不会给您带来麻烦,因为cdef class的继承受到了严格的限制(来自另一个cdef class的单个继承),因此您不必面对super涉嫌的复杂情况。