2015-11-22 10 views
6

chciałbym mieć tablicę Cython z klasy cdef:Cython: w jaki sposób utworzyć tablicę klasy cdef

cdef class Child: 
    cdef int i 

    def do(self): 
     self.i += 1 

cdef class Mother: 
    cdef Child[:] array_of_child 

    def __init__(self): 
     for i in range(100): 
      self.array_of_child[i] = Child() 
+1

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

+0

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

Odpowiedz

8

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).

Powiązane problemy