<p>在<code>ctypes.Structure</code>的文档中,它解释了如何执行此操作:</p>
<blockquote>
<p>It is possible to define the <code>_fields_</code> class variable <em>after</em> the class
statement that defines the Structure subclass, this allows to create
data types that directly or indirectly reference themselves</p>
</blockquote>
<p>这意味着您可以添加:</p>
<pre><code>class python_format(ctypes.Structure): # forward declaration
pass
</code></pre>
<p>然后在定义<code>OPENFUNC</code>(以及其他函数类型)之后:</p>
^{pr2}$
<p>因此,能够定义<code>python_format._fields_</code>:</p>
<pre><code>python_format._fields_ = (
('can_open', CANOPENFUNC),
('open', OPENFUNC),
('delete', DELETEFUNC),
('read', READFUNC),
)
</code></pre>
<p>下面是一个基于您的代码的更完整的示例:</p>
<pre><code>import ctypes
class python_format(ctypes.Structure): # forward declaration
pass
CANOPENFUNC = ctypes.PYFUNCTYPE(ctypes.c_int, ctypes.c_char_p)
OPENFUNC = ctypes.PYFUNCTYPE(ctypes.c_int,
ctypes.POINTER(python_format),
ctypes.c_char_p)
DELETEFUNC = ctypes.PYFUNCTYPE(None, ctypes.c_void_p)
READFUNC = ctypes.PYFUNCTYPE(ctypes.c_int, ctypes.c_void_p)
def py_canopen_func(self, string):
print "py_canopen_func", string
return 1
def py_open_func(self, string):
print "py_open_func2", string
# Return types from callbacks cannot be anything other than simple
# datatypes (c_int, c_float, ..., c_void_p). For other datatypes
# (STRUCTURE, POINTER, ...), ctypes returns the following error
# "Invalid result type for callback function"
# see http://bugs.python.org/issue5710
return 1 # can't return ctypes.byref(self)
canopen_func = CANOPENFUNC(py_canopen_func)
open_func = OPENFUNC(py_open_func)
#delete_func = DELETEFUNC(py_canopen_func)
#read_func = READFUNC(py_canopen_func)
class python_format(ctypes.Structure):
python_format._fields_ = (
('can_open', CANOPENFUNC),
('open', OPENFUNC),
('delete', DELETEFUNC),
('read', READFUNC),
)
def __init__(self):
self.can_open = canopen_func
self.open = open_func
#self.delete = delete_func
#self.read = read_func
pf = python_format()
</code></pre>