Myślę, że odpowiedź brzmi nie: newsgroup post of essentially the same question
Zasadniczo, tablica musiałby być tablicą wskaźników do twojego Child
, a nie bezpośrednią tablicą z Child
s. To musi tak być, ponieważ gdziekolwiek indziej pojawia się odniesienie do Child
w tablicy, że Child
musi pozostać przy życiu (ale nie całą tablicą), co nie byłoby możliwe, gdyby zajęli ten sam fragment pamięć.
Obszar roboczy zasugerowany w poście jest przeznaczony do używania listy pytonów. Możesz także użyć tablicy numpy z dtype=object
. Jeśli chcesz uzyskać dostęp do funkcji cdef w klasie można zrobić odlew pierwszy:
cdef Child c = <Child?>a[0] # omit the ? if you don't want
# the overhead of checking the type.
c.some_cdef_function()
Inną możliwością może być do przechowywania danych jako struct C (cdef struct ChildStruct: ....
), które mogą być łatwo przechowywane w postaci tablicy . Jeśli potrzebujesz interfejsu Pythona do tej struktury, możesz zdefiniować Child
, tak aby zawierał kopię ChildStruct
(ale modyfikacje nie będą propagować z powrotem do oryginalnej tablicy) lub wskaźnik do ChildStruct
(ale musisz być ostrożny z zapewnieniem, że pamięć nie została zwolniona, co wskazuje na to, że wskazuje na nią Child
).
Czy masz podstawy, aby sądzić, że moja odpowiedź jest nieaktualna? Spojrzałem na dziennik zmian i nie widziałem niczego oczywistego. Sądzę, że istnieją dobre techniczne powody, dla których jest mało prawdopodobne, aby to się zmieniło. – DavidW
Co masz na myśli przez "tablicę cytonów z klasy cdef"? Czy odpowiada on C++ 'Child a [n]' dla jakiegoś 'n' lub' Child * '? Oczywiście istnieją pewne problemy w twoim kodzie (powinno to być 'self.array_of_child', pamięć dla' array_of_child' powinna zostać przydzielona, a następnie uwolniona), więc może naprawienie tych problemów spowoduje, że będziesz bardziej przejrzysty, co spróbujesz osiągnąć. – ead