在 Python 类中继承 Cython 类

在一个项目中,有两个用 Cython 编写的类,分别是 cosmo 和 PositionsD,并且希望在使用 Python 类 modelfit 时能够使用它们。在 modelfit 类中,需要继承 PositionsD 类的属性,并创建一个继承了 cosmo 类的对象。

2. 解决方案

2.1 修改 Cython 类

首先,需要对 Cython 类 PositionsD 进行一些修改。在 PositionsD 类中,存在两个私有属性 _x_y,用来存储位置信息。同时,还存在两个公有属性 x 和 y,用来对 _x_y 进行访问和修改。

但是,在 Python 类中使用 Cython 类时,需要对 Cython 类的公有属性进行特殊处理。需要使用 cdef 关键字声明公有属性,并使用 property 装饰器来定义对这些公有属性的访问和修改方式。

2.2 修改 Python 类

其次,需要对 Python 类 modelfit 进行修改。在 modelfit 类中,需要继承 PositionsD 类的属性。同时,还需要创建一个继承了 cosmo 类的对象。

2.3 代码示例

以下是修改后的 Cython 类 PositionsD 和 Python 类 modelfit 的代码:

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

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

    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]
from position import *
import numpy as np

class modelfit(PositionsD):
    cosmo = cosmo()  # 创建 cosmo 对象

    def __init__(self, shear_pos):
        super(modelfit, self).__init__(shear_pos)  # 继承 PositionsD 类的属性

        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= self.cosmo.rc(self.halo_z)  # 使用 cosmo 对象的属性

这样就可以在 Python 类 modelfit 中继承 PositionsD 类的属性,并创建一个继承了 cosmo 类的对象。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值