我有以下代码:
class MyStruct(ctypes.Structure):
_fields_= [('id', ctypes.uint),
('perm', ctypes.uint)]
定义类时,我可以直接在我的字段上复制缓冲区中的数据。 例如:
ms = MyStruct.from_buffer_copy("\xAA\xAA\xAA\xAA\x11\x11\x11\x11")
print ms.id, ms.perm
Everythings工作正常,此处 id 将 0xAAAAAAAA 且 perm 等于 0x11111111 。
现在,我试图在实例化过程中做同样的事情,使用以下代码:
class MyStruct(ctypes.Structure):
_fields_= [('id', ctypes.uint),
('perm', ctypes.uint)]
def __init__(self):
super(MyStruct, self).__init__()
self.from_buffer_copy("\xAA\xAA\xAA\xAA\x11\x11\x11\x11")
ms = MyStruct()
print ms.id, ms.perm
但我的代码使用以下语句引发错误:
AttributeError:'MyStruct'对象没有属性'from_buffer_copy'
经过一些研究后,我发现from_buffer_copy
是一种ctypes._CData
方法。在文档中,我们可以看到_CData
类是non-public class。
所以这是我的问题。我想在构造函数中使用from_buffer_copy
,但此时它看起来“不可调用”。你可以帮帮我吗 ?
预先感谢您的回复 此致
PS:我不想使用样式super(MyStruct,self).__init__(id=0x44444444,perm=0x11111111)
,因为在我的真实代码中,我的字段变量有很多参数。
答案 0 :(得分:7)
问题是from_buffer_copy从给定的缓冲区创建 new Structure实例。当你在__init__中使用它时,结构已经被创建,因此无法使用from_buffer_copy(这就是为什么它只能作为类方法而不是实例方法使用)。
一个简单的解决方案就是继续使用MyStruct.from_buffer_copy或编写另一个工厂功能以满足您的需求。如果您坚持使用MyStruct(缓冲区),那么您可以使用__new__来实现此目的,因为在创建实例之前它被称为:
import ctypes
class MyStruct(ctypes.Structure):
_fields_= [('id', ctypes.c_uint),('perm', ctypes.c_uint)]
def __new__(cls, buf):
return cls.from_buffer_copy(buf)
def __init__(self, data):
pass ## data is already present in class
ms = MyStruct("\xAA\xAA\xAA\xAA\x11\x11\x11\x11")
print ms.id, ms.perm