Cython中如何重写__cinit__函数并使用不同参数签名?
Cython子类重写__cinit__的实现方案
你提出的需求可以实现,但直接按给出的代码编写会报错——Cython要求子类的__cinit__必须调用父类的__cinit__,否则父类的初始化逻辑无法执行,而父类A的__cinit__必须接收a、b和可选的argv参数。
正确实现代码
虽然子类B不需要使用参数b,但仍需为父类的__cinit__传入合法的b值(比如0或其他符合业务逻辑的默认值),修改后的代码如下:
cdef class A: cdef int a cdef int b def __cinit__(self, int a, int b, *argv): self.a = a self.b = b cdef class B(A): cdef double c def __cinit__(self, int a, double c, *argv): # 显式调用父类__cinit__,传入必要的b参数(此处用0作为默认值) A.__cinit__(self, a, 0, *argv) self.c = c
关键说明
- 必须显式调用父类的
__cinit__,否则父类的成员变量b会处于未初始化状态,可能引发未定义行为。 - 若父类A是无法修改的已有类,只能在子类调用父类
__cinit__时传入b的默认值;如果可以修改父类,也可以给父类__cinit__的b参数设置默认值,让子类调用更灵活。
内容的提问来源于stack exchange,提问作者ajl123
相关产品推荐
相关产品推荐

