首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cython无法使用setattr

Cython无法使用setattr
EN

Stack Overflow用户
提问于 2014-06-02 10:35:50
回答 1查看 587关注 0票数 4

我在cython中有一个cdef类,我想用setattr内置函数初始化它的字段。然而,当我这样做的时候,我得到了一个执行错误:

代码语言:javascript
复制
/path/.../cimul.cpython-34m.so in cimul.Simulation.__init__ (cimul.c:5100)()
AttributeError: 'Simulation' object has no attribute 'Re'

我的代码如下:

代码语言:javascript
复制
cdef class Simulation:
    cdef double Re, Pr, Ra, a, dt_security
    cdef int Nz, NFourier, freq_output, freq_critical_Ra, maxiter
    cdef bool verbose

    def __init__(self, *args, **kargs):
        param_list = {'Re': 1, 'Pr': 1, 'Ra': 1, 'a' : 1, 'Nz': 100,
                      'NFourier': 50, 'dt_security': 0.9,
                      'maxiter': 100, 'freq_output': 10,
                      'freq_critical_Ra':50, 'verbose': False}
        # save the default parameters
        for param, value in param_list.items():
            setattr(self, param, value)

你知道我怎么才能绕过这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2014-06-03 04:35:51

  • 当在类中定义(没有公共)属性时,你真正要做的就是在C结构中定义一些字段。因此,在编译(Cython + C)之后,属性的名称会丢失,它们只由C结构开头的某个偏移量来标识。
  • 如果你添加cdef public,他们会添加一些property访问函数,该函数不仅允许从Python访问,还可以在C结构中保留关联标识符<-->偏移量。通过这些属性函数会产生一些开销。另请注意,这些函数执行Python类型检查/转换。

现在回答您的问题,您需要以某种方式保持关联标识<-->偏移量。如果你想让事情变得更快,唯一的办法就是手工完成:

代码语言:javascript
复制
self.RE = param_list['RE']   # self.RE is a C struct access
self.Pr = param_list['Pr']
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23986606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档