Python:从ctypes派生POINTER和“TypeError:无法创建实例:没有_type_”

时间:2012-10-01 21:19:30

标签: python ctypes

我正在尝试强制Python 2.7为ctypes POINTER(<type>)打印格式化字符串。我想我会编写一个继承自POINTER并重载__str__的类。不幸的是运行这段代码:

from ctypes import *

pc_int = POINTER(c_int)
class PInt(pc_int):
    def __str__(self):
        return "Very nice formatting ", self.contents

print pc_int(c_int(5))
print PInt(c_int(5))

失败并出现此类异常

$ python playground.py
<__main__.LP_c_int object at 0x7f67fbedfb00>
Traceback (most recent call last):
  File "playground.py", line 9, in <module>
    print PInt(c_int(5))
TypeError: Cannot create instance: has no _type_

有谁知道如何干净地达到预期的效果或这个例外意味着什么?

只有1个谷歌搜索结果“TypeError:无法创建实例:没有类型”并且没有那么有帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是用于实现ctypes及相关类的POINTER元类直接在类字典中查找_type_等特殊字段,因此无法处理继承的特殊字段

修复很简单:

pc_int = POINTER(c_int)
class PInt(pc_int):
    _type_ = c_int # not pc_int
    ...