【发布时间】:2021-05-19 21:47:42
【问题描述】:
我想通过继承 Cython 中的 python 类来构建一个子类。看来我不能直接这样做,因为我在下面遇到错误。有什么解决办法吗?
代码(osmium是第三方python包,可以使用pip安装):
import osmium
cdef class CounterHandler(osmium.SimpleHandler):
cdef list nodes, ways, relations
def __init__(self):
osmium.SimpleHandler.__init__(self)
self.nodes = []
self.ways = []
self.relations = []
def node(self, n):
pass
def way(self, w):
pass
def relation(self, r):
pass
错误信息:
add.pyx:22:32: First base of 'CounterHandler' is not an extension type
Traceback (most recent call last):
File "setup.py", line 11, in <module>
ext_modules=cythonize("add.pyx"))
File "C:\ProgramData\Miniconda3\envs\osmium\lib\site-packages\Cython\Build\Dependencies.py", line 1102, in cythonize
cythonize_one(*args)
File "C:\ProgramData\Miniconda3\envs\osmium\lib\site-packages\Cython\Build\Dependencies.py", line 1225, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: add.pyx
我尝试了 DavidW 提供的解决方案
解决方案 2 代码:
import osmium
cdef class CounterHandlerBase:
cdef list nodes, ways, relations
def __init__(self):
self.nodes = []
self.ways = []
self.relations = []
cdef node(self, n):
pass
cdef way(self, w):
pass
cdef relation(self, r):
pass
class CounterHandler(CounterHandlerBase, osmium.SimpleHandler): # osmium.SimpleHandler
def __init__(self):
CounterHandlerBase.__init__(self)
osmium.SimpleHandler.__init__(self)
错误信息:
Traceback (most recent call last):
File "C:/Users/Administrator/Dropbox (ASU)/Work/CAVLite/OSM2GMNS/V2/cython_test/tets.py", line 7, in <module>
import solution2 as solution
File "solution2.pyx", line 28, in init solution2
class CounterHandler(CounterHandlerBase, osmium.SimpleHandler): # osmium.SimpleHandler
TypeError: multiple bases have instance lay-out conflict
解决方案 3 代码:
import osmium
cdef class DummyBase:
def __init__(self):
pass
cdef class CounterHandler(DummyBase, osmium.SimpleHandler): # osmium.SimpleHandler
cdef list nodes, ways, relations
def __init__(self):
DummyBase.__init__(self)
osmium.SimpleHandler.__init__(self)
self.nodes = []
self.ways = []
self.relations = []
cdef node(self, n):
pass
cdef way(self, w):
pass
cdef relation(self, r):
pass
错误信息:
Traceback (most recent call last):
File "C:/Users/Administrator/Dropbox (ASU)/Work/CAVLite/OSM2GMNS/V2/cython_test/tets.py", line 7, in <module>
import solution3 as solution
File "solution3.pyx", line 16, in init solution3
cdef class CounterHandler(DummyBase, osmium.SimpleHandler): # osmium.SimpleHandler
TypeError: best base 'osmium._osmium.SimpleHandler' must be equal to first base 'solution3.DummyBase'
【问题讨论】:
标签: python cython subclass cythonize