2015-05-16 3 views
1

У меня есть два класса, которые написаны в cython, и я хочу использовать их в классе в python.наследует класс Cython в классе Python

position.pyx

import numpy as np 
cimport numpy as np 
cimport cython 
cpdef double std_G,v=4.3e-9, 299792.458 

cdef class cosmo(object): 
    cdef public double o_m, o_l, h, w, o_r, G, v 
    def __init__(self,double o_m = 0.3, double o_l = 0.7, double h = 0.7, double w = -1, double o_r = 0., double G = std_G): 

     self.o_m = o_m 
     self.o_l = o_l 
     self.o_r = o_r 
     self.h = h 
     self.w = w 
     self.G = G 
     self.v = v 

    def __copy__(self): 

     return cosmo(o_m = self.o_m, o_l = self.o_l, h = self.h, w = self.w, o_r = self.o_r, G = self.G) 

    property H0: 
     def __get__(self): 
      return 100*self.h 

    property M_solar: 
     def __get__(self): 
      return 1.989e30 

    property Mpc_to_m: 
     def __get__(self): 
      return 3.0856e22; 

    def hubble2(self, double z): 
     cdef double inv_a 
     inv_a = 1.+z 
     return (self.o_r*inv_a**4 + self.o_m*inv_a**3 + \ 
        self.o_l*(inv_a**(3*(1+self.w))) + (1 - self.o_m - self.o_l - self.o_r)*inv_a**2)*self.H0**2 

    property hubble_length: 
     def __get__(self): 
      return self.v/self.H0 

    def rc(self, double z): 

     return 3.*self.hubble2(z)/(8*np.pi*self.G) 

cdef class PositionsD(object): 

    cdef double [:] _x 
    property x: 
     def __get__(self): 
      return np.array(self._x) 
     def __set__(self, np.ndarray[DTYPE_T, ndim=1] x): 
      self._x = x 

    cdef double [:] _y 
    property y: 
     def __get__(self): 
      return np.array(self._y) 
     def __set__(self, np.ndarray[DTYPE_T, ndim=1, mode='c'] y): 
      self._y = y 

    def __init__(self, np.ndarray[DTYPE_T, ndim=2, mode='c'] positions): 
     self._x = positions[:,0] 
     self._y = positions[:,1] 

В то время как я хочу использовать PositionsD класс в modelfit классе в то время как modelfit наследует свойство PositionsD:

from position import * 
import numpy as np 
class modelfit(PositionsD): 
    cosmo = cosmo() 
    def __init__(self): 
     super(modelfit,self).__init__(shear_pos) 

     self.arcsec2rad = 2*np.pi/180./3600. 
     self.shear_g = None 
     self.shear_pos = shear_pos *self.arcsec2rad 
     self.shear_z = None 
     self.halo_pos = None 
     self.halo_z = None 
     self.sigma_g = np.sqrt(np.std(self.shear_g[:,1]**2+self.shear_g[:,2]**2))/np.sqrt(2) 
     self.n_model_evals = 0 
     self.gaussian_prior_theta = [{'mean' : 14, 'std': 0.5}] 
     self.rho_c= cosmo.rc(self.halo_z) 

Но я получаю следующее сообщение об ошибке :

>>> x=np.array([[0.3,-0.1],[1,3.4]]) 
>>> mf=modelfit(x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() takes exactly 1 argument (2 given) 

Я не знаю, что я делаю неправильно. Любое предложение?

+0

Теперь что такое 'init'? Используйте '__init__'. –

+0

@AshwiniChaudhary Произошла ошибка. Я обновил. – Dalek

+1

'' modelfit' '__init__' в настоящее время не ожидает никаких аргументов, и вы передаете его. –

ответ

0

я узнал для моего приложения лучший способ воспользоваться свойством PositionsD класса использовать его следующим образом:

from position import * 
import numpy as np 
class modelfit(object): 
    def __init__(self): 
     self.cosmo = cosmo() 
     self.arcsec2rad = 2*np.pi/180./3600. 
     self.shear_g = None 
     self.source_pos = None 
     self.shear_z = None 
     self.halo_pos = None 
     self.halo_z = None 
     self.gaussian_prior_theta = [{'mean' : 14, 'std': 0.5}] 
    def get_shear_pos(self): 
     return PositionsD(self.source_pos*self.arcsec2rad) 

    shear_pos = property(get_shear_pos) 

    def get_halo_center(self): 
     return PositionsD(self.halo_pos*self.arcsec2rad) 

    halo_center = property(get_halo_center) 

    def get_sigma_g(self): 
     return np.sqrt(np.std(self.shear_g[:,1]**2+self.shear_g[:,2]**2))/np.sqrt(2) 

    sigma_g = property(get_sigma_g) 
    def get_rho_c(self): 
     return self.cosmo.rc(self.halo_z) 

    rho_c = property(get_rho_c) 

Пример из приложения I был найден как:

>>> m=modelfit() 
>>> r=np.array([[0.2,-0.5],[2.1,9.3],[3.1,-2.8],[0.01,0.211]]) 
>>> m.source_pos=r 
>>> m.shear_pos 
<position.PositionsD object at 0x7f91a40e81e0> 
>>> m.shear_pos.x 
array([ 1.93925472e-06, 2.03621746e-05, 3.00584482e-05, 
     9.69627362e-08]) 
>>> m.shear_pos.x/m.arcsec2rad 
array([ 0.2 , 2.1 , 3.1 , 0.01]) 
>>> m.shear_pos.y/m.arcsec2rad 
array([-0.5 , 9.3 , -2.8 , 0.211]) 
2

В вашем текущем определении класса __init__ не ожидает никаких аргументов. Вот почему возникает ошибка при вызове mf=modelfit(x). Поскольку shear_pos не будет определен иначе, я предполагаю, что вы намерены передать его в качестве аргумента в инициализации вашего класса. Если да, то вы должны написать:

class modelfit(PositionsD): 
    cosmo = cosmo() 
    def __init__(self, shear_pos): 
     super(modelfit,self).__init__(shear_pos) 
     ... 
Смежные вопросы