擅长:python、mysql、java
<p>我做了一些实验,有了很好的答案,但现在我知道问题出在哪里了:</p>
<blockquote>
<p>If your extension type has a base type, the <code>__cinit__</code> method of the
base type is automatically called before your <code>__cinit__</code> method is
called; you cannot explicitly call the inherited <code>__cinit__</code> method.</p>
</blockquote>
<p>所以真正的问题是Cython类型仍然没有构造函数,只有pre-initializer hook <code>__cinit__</code>,它们的行为更像默认构造函数。不能从构造函数调用虚方法,也不能从<code>__cinit__</code>调用它(如果进行调用,它的行为类似于非虚方法)。在</p>
<p>不知何故在<code>__cinit__</code>内,<code>type(self)</code>返回了正确的类型对象,但它是无用的。Cython没有静态字段,方法和类型object只能是<code>type</code>的实例(没有元类)。{cd6>Python很容易被重写。在</p>
<p>因此,没有其他方法可以将分配放在<code>def __init__(self):</code>内,并在使用它的任何地方检查初始化的<code>thisptr</code>。在</p>
<P>您可以考虑创建全局虚拟C++对象,并将其赋值到{{CD8}},以避免检查和崩溃。没有post初始化器钩子,因此您将无法检查是否已经进行了正确的初始化。在</p>