嗯,你是對的,你應該看到cinit方法調用你的父類。它在文檔中這麼說。
http://docs.cython.org/src/userguide/special_methods.html
這裏是我嘗試使用:
cdef class BaseClass:
def __cinit__(self,char* name):
print "BaseClass __cinit__()"
#...
def __dealloc__(self):
print "BaseClass __dealloc__()"
#...
cdef class DerClass(BaseClass):
def __cinit__(self,char* name,int n):
print "DerClass __cinit__()"
#...
def __dealloc__(self):
print "DerClass __dealloc__()"
#...
它編譯,但是當我試圖運行它,它給了我這個錯誤:
[email protected]:~/testing$ python runner.py
DerClass __dealloc__()
BaseClass __dealloc__()
Traceback (most recent call last):
File "runner.py", line 4, in <module>
DerClass('Ciao', 1)
File "test.pyx", line 2, in test.BaseClass.__cinit__ (test.c:488)
def __cinit__(self,char* name):
TypeError: __cinit__() takes exactly 1 positional argument (2 given)
[email protected]:~/testing$
因此,我改變的BaseClass。 cinit也採用DerClass的「int n」參數。 CINIT做:
cdef class BaseClass:
def __cinit__(self, char * name, int n):
print "BaseClass __cinit__()"
#...
def __dealloc__(self):
print "BaseClass __dealloc__()"
#...
cdef class DerClass(BaseClass):
def __cinit__(self,char* name,int n):
print "DerClass __cinit__()"
#...
def __dealloc__(self):
print "DerClass __dealloc__()"
#...
而現在它似乎很好地工作:
[email protected]:~/testing$ python runner.py
BaseClass __cinit__()
DerClass __cinit__()
DerClass __dealloc__()
BaseClass __dealloc__()
[email protected]:~/testing$
這裏是我的runner.py文件:
from test import *
if __name__ == "__main__":
DerClass('Ciao', 1)