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



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

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之间的区别。关键是我需要这段代码尽可能快。

赛通 0.29.14 蟒蛇 3.7.4

super的问题在于,它在很大程度上被视为一个返回通用 Python 对象的 Python 函数,必须在运行时处理。cdef方法仅在 Cython 在编译时知道类型时才可用,因此它无法从super的结果中访问它们。(可以说,在这种情况下,Cython的更聪明版本可能应该能够弄清楚......

幸运的是,Cython 文档中说明了另一种方法:您只需要显式调用基类方法(无需通过super进行自省(。在您的情况下

base.nop(self)

缺乏super不应该给您带来问题,因为cdef classes的继承受到很大限制(来自另一个cdef class的单个继承(,因此您不必应对据称super的复杂情况。

最新更新