<p>我以前从来没见过赛顿,所以请原谅我,如果这太离谱了。上面说:</p>
<P> C++中,任何时候你有{{*CD1>}(^ {CD2>}继承从^ {CD3>}),如果^ {< CD3>}有默认构造函数,则当^ {CD2>}被创建时它将被自动调用。除非您为父级调用自己的自定义构造函数。在</p>
<p>我不懂Python,但一些快速的google搜索告诉我同样的原则也适用。i、 只有当<code>PyA</code>没有手动调用另一个时,<code>PyA</code>的默认构造函数才会被调用。在</p>
<p>那样的话,这样的事情不管用吗?在</p>
<pre><code>cdef class PyA:
cdef A* thisptr
def __cinit__(self, bypasskey="")
if bypasskey == "somesecret"
print "in A: bypassing allocation"
else
print "in A: allocating thisptr"
self.thisptr = new A()
...
cdef class PyB(PyA):
def __cinit__(self):
super( PyB, self ).__init__("somesecret")
</code></pre>
<p>请注意,我肯定这很粗糙。但也许这里的想法会给你一些工作上的帮助?在</p>
<hr/>
<p>还有一个主意。我几乎可以肯定它会起作用(但是语法是关闭的),而且它肯定比上面的要干净得多:</p>
^{pr2}$
<p>或者看起来像这样?在</p>
<pre><code>cdef class PyA:
cdef A* thisptr
def __cinit__(self, t=A)
self.thisptr = new t()
...
cdef class PyB(PyA):
def __cinit__(self):
super( PyB, self ).__init__(B)
</code></pre>
<hr/>
<p>我不是为了赏金而发这个帖子的(你也不是被迫把它分配给任何人的),我只是和你分享一些想法。在</p>
<p>我认为你可以/应该能够避免“撞坏翻译”</p>
<p>a)使第二个构造函数只对b可见(不知道这是否可能),或</p>
<p>b)在其他地方使用前检查a是否为空,或</p>
<p>c)在绕过分配之前,检查调用函数是否是b的构造函数。在</p>
<P>也可以使用Cython C++文档{a1},可能没有所有C++解决方案的惯用解决方案,模糊的、挥手的引语如“它可能需要别人做一些实验(你?)找到最优雅的方法来处理这个问题。”</p>