在cython中伪造模板
Faking templates in cython
这个问题与这个问题有关,从某种意义上说,它应该是一个解决方案,但不工作,我想知道为什么。其思想是将模板的不同实例化为某些抽象类的派生类,这些类的函数然后只调用派生类对象上的方法。然而,它完全不起作用:
<标题> foo.pyx h1>from distutils.core import setup, Extension
from Cython.Build import cythonize
e = Extension("foo", sources=["foo.pyx"], language="c++")
setup(ext_modules = cythonize([e]))
在ipython In [1]: import foo
In [2]: v = foo.iVector(range(5))
In [3]: v.show()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-ea66b5f25fed> in <module>()
----> 1 v.show()
/home/kartikv/Programs/foo.pyx in foo.Vector.show (foo.cpp:768)()
2 cdef class Vector:
3 def show(self):
----> 4 print(self.v)
5
6 cdef class iVector(Vector):
AttributeError: 'foo.iVector' object has no attribute 'v'
标题>
当Cython编译print(self.v)
时,它必须决定是发出访问python级还是c级属性的代码。由于没有为Vector类声明名为v
的cdef属性,因此它会发出用于python级别访问的代码。
在派生类中,iVector
类中的v
属性为"…"直接存储在对象的C结构体中。"。它不能在Python中使用,只能在C中使用,从而导致您看到的错误。
您可以将v
声明为public
或readonly
,这将使其对Python可见,但这不适用于更复杂的类型(如您在评论中提到的)。
你要做的是实现一个"虚拟"属性。这在c++中也行不通:当你试图访问一个不存在的属性时,你会得到一个编译器错误,即使存在一个具有该属性的派生类。
一般来说,您可以通过将属性访问转换为调用cdef
方法来解决这个问题,该方法是"虚拟的",但具体如何做取决于您要解决的实际问题。
相关文章:
- 伪造事实↔false
- 如何在C++中伪造虚拟可变参数函数模板?
- 将 PCL 链接到 Cython C++ 模块
- 将数组/向量发送到 c++ 脚本的 cython 示例
- Cython:无法分配给 2D 矢量
- Cython通过浮点数的最快方式,用于高频控制回路
- Cython 包含catkin_pkg设置的错误
- 在 Cython 中传递浮点数组的最佳选择
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 通过Cython对Python的基本C++函数
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 从python调用C++函数,使用cython,使用cythonize
- 如何通过 cython 将 numpy 数组列表传递给 C++
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- Cython中带有自定义比较器的优先级队列
- 重载的 operator() 在 Cython 中失败
- 在Cython中使用C库时,我遇到了一个错误
- 在C++/Cython中,是否可以只声明相关属性在Python中可见
- 在cython中伪造模板