Ich denke, die Antwort ist nein: newsgroup post of essentially the same question
Im Wesentlichen das Array würde ein Array von Zeigern zu Ihrem Child
sein, anstatt eine direkte Anordnung von Child
s. Es muss so sein, denn wo sonst jemals ein Verweis auf eine Child
im Array kommt, muss Child
am Leben gehalten werden (aber nicht das ganze Array), was nicht wirklich möglich wäre, wenn sie den gleichen Teil von Erinnerung.
Die im Newsgroup-Post vorgeschlagene Arbeitsumgebung besteht lediglich darin, eine Python-Liste zu verwenden. Sie könnten auch ein Nummernfeld mit dtype=object
verwenden. Wenn Sie eine cdef Funktion in der Klasse zugreifen müssen, können Sie eine Besetzung zuerst tun:
cdef Child c = <Child?>a[0] # omit the ? if you don't want
# the overhead of checking the type.
c.some_cdef_function()
Eine weitere Möglichkeit könnte sein, Ihre Daten als C-Struktur zu speichern (cdef struct ChildStruct: ....
), die leicht als Array gespeichert werden kann . Wenn Sie eine Python-Schnittstelle für diese Struktur benötigen, können Sie entweder Child
definieren, so dass sie eine Kopie von ChildStruct
enthält (aber Änderungen werden nicht an das ursprüngliche Array weitergegeben), oder einen Zeiger auf ChildStruct
(aber Sie müssen darauf achten, dass der Speicher ist nicht frei, der Child
zeigt, ist lebendig).
Haben Sie Grund zu der Annahme, dass meine Antwort nicht mehr aktuell ist? Ich habe mir das Changelog angeschaut und kann dort nichts Offensichtliches sehen. Ich denke, es gibt gute technische Gründe, warum sich das kaum ändern wird. – DavidW
Was meinen Sie mit "Cython-Array einer Cdef-Klasse"? Entspricht es C++ 's Child a [n] 'für einige' n' oder 'Child *'? Es gibt offensichtlich einige Probleme in Ihrem Code (es sollte 'self.array_of_child' sein, Speicher für' array_of_child' sollte zugewiesen und dann freigegeben werden), so dass das Beheben dieser Probleme klarer machen wird, was Sie versuchen zu erreichen. – ead