2016-03-28 25 views
1

Cython'da, bir sınıf veya uzantı tipi bir Python sınıfıdır; bu, Python tarafından başlatılabileceği anlamına gelir. Diğer taraftan, __init__ veya __cinit__ parametrelerinin Python Nesnesi olması gerekir.Cython'da "saf" C++ sınıfı yazmak mümkün mü?

Cython'da bir sınıf yazmak mümkündür, bu sadece cdef işlevleri tarafından başlatılabilir ve böylece C türleri ve C++ nesneleri tarafından başlatılabilir mi?

Bunu yapmak istiyorum çünkü mevcut Python kodlarımı C/C++ kodundan Cython koduna çevirmek daha kolay olurdu.

Sen oldukça kolay (kolayca) Python başlatıldı edilemez bir sınıf oluşturabilir, ama sadece cdef fabrika işlevinden oluşturulabilir
+1

cdef cppclass tarafından C++ sınıfının yazılması mümkün olduğunu buldum. Bununla birlikte, yıkıcı işlevi, aşırı yüklenici gibi bir çok C++ özelliği desteklenmez. Belki gelecek sürümlerde desteklenecekler? – iuradz

cevap

0

cdef class ExampleNoPyInit: 
    cdef int value 

    def __init__(self): 
     raise RuntimeError("Cannot be initialise from python") 

cdef ExampleNoPyInit_factory(int v): 
    cdef ExampleNoPyInit a 

    # bypass __init__ 
    a = ExampleNoPyInit.__new__(ExampleNoPyInit) 
    a.value = v 
    return a 

inst = ExampleNoPyInit_factory(5) 

(Gerçekten aynı kullanabilirsiniz işlenen zanlısı eğer isterlerse Python'da başlatma yöntemi. Eğer daha kapsamlı olmak istiyorsanız, başlatma işlemini önlemenin başka yolları da vardır - örneğin, Cython modülünüzde bir cdef global değişkenini Python'dan erişilemeyen bir bayrak olarak kullanabilirsiniz) .

Bu hala sınıf hala yerleşik bir Python referans sayma mekanizmasına sahiptir, bu yüzden hala bir "Python sınıfı" dır. Bundan kaçınmak istiyorsanız, cdef struct numaralı telefonu kullanabilirsiniz (üye işlevlerine sahip olmamakla birlikte).

İlgili konular