在ctypes子类上使用__repr __()?

时间:2012-05-22 19:00:03

标签: python ctypes

我正在玩ctypes一点点按摩我写入Python的一些C代码。 C代码在很大程度上依赖于结构和联合,而目前,Python中的快速解决方案是通过ctypes继承它们:

即,从这个:

struct foo {
    uint32_t a;
    uint32_t b;
    uint16_t c;
    uint16_t d;
};


对此:

from ctypes import *

class Foo(Structure):
    _fields_ = [("a", c_uint),
                ("b", c_uint),
                ("c", c_ushort),
                ("d", c_ushort)]

除此之外,如果我将一个__repr__()定义扔到Python类中,然后在一个实例上使用repr(),那么我所得到的只是<class 'Foo'>(或者是那种效果,回想一下记忆了一下)。

所以我想知道是否有办法利用repr()并尝试在Python和C之间充分利用这两个世界,或者我是否应该查看元类并使用struct库将字节打包/解压缩到适当的Python类中。

思想?

1 个答案:

答案 0 :(得分:2)

我真的不明白这个问题。 这很好用:

from ctypes import *

class Foo(Structure):
    _fields_ = [("a", c_uint),
                ("b", c_uint),
                ("c", c_ushort),
                ("d", c_ushort)]

    def __repr__(self):
        return "<Foo: a:%d b:%d c:%d e:%d>" % (self.a, self.b, self.c, self.d)

f = Foo(1,2,3,4)
print repr(f)

# <Foo: a:1 b:2 c:3 e:4>

只有你这样做:

print repr(Foo)

你最终会得到

<class '__main__.Foo'>

或类似的东西。

您确定在实例上使用repr吗?