将 ctypes.POINTER(instance) 变成实际实例?

Turning ctypes.POINTER(instance) into an actual instance?

我有以下 ctypes 函数,它接受一个文件名和 return 一个指向 Image 实例的指针:

class Image(ctypes.Structure):
  _fields_ = (
      ('image_info', ImageInfo),
      ('type', ctypes.c_int),
      ('format', ctypes.POINTER(Format) ),
  )
my_image_open = _lib.my_image_open
my_image_open.argtypes = [ ctypes.c_char_p ]
my_image_open.restype = ctypes.POINTER(Image)

我想提供一些语法糖并在 Image 构造函数中包装 my_image_open。但是我不能简单地将 returned 指针绑定到 self:

class Image(ctypes.Structure):
  def __init__( self, filename ):
    img = my_image_open( filename )
    self = img[0] # does not work, since self is local !

做上面的事情有意义吗,或者我应该简单地使用一个独立的函数 returning 一个实例:

c_image_open = _lib.my_image_open
c_image_open.argtypes = [ ctypes.c_char_p ]
c_image_open.restype = ctypes.POINTER(Image)
# syntactic sugar:
def my_image_open( filename ):
  img = c_image_open( filename )
  return img[0]

所以我最终遵循了@eryksun 的建议:

class Image(ctypes.Structure):
  _fields_ = (
      ('image_info', ImageInfo),
      ('type', ctypes.c_int),
      ('format', ctypes.POINTER(Format) ),
  )
  @classmethod
  def open(cls,filename):
    img = my_image_open( filename )
    if img: return img[0]
    return None