如何在ctypes.pointer.contents中设置attr



我在代码中使用了一个自定义的ctypes,但我发现我在ctypes.pointer.contents中什么都不能设置

import ctypes
class Test(ctypes.Structure):
_fields_ = (("value", ctypes.c_int), )
def __init__(self,  *args, **kwargs):
self.vars_len = 1
super().__init__(*args, **kwargs)
t = Test(5)
pt = ctypes.pointer(t)
print(f"t.vars_len:{t.vars_len}")
print(hasattr(pt.contents, "vars_len"))
pt.contents.vars_len = "hello"
print(hasattr(pt.contents, "vars_len"))

输出:

t.vars_len:1
False
False

实例化时的定义和setattr都不会生效。所以我想知道如何在ctypes.pointer.contents中设置attr?我想实现一个自定义的ctypes,它是一个可变长度的点,具有"vars_len";attr来描述数据的长度,但我不想修改ctype的_fields_。或者还有别的办法吗?

你不能这么做。CCD_ 1封装存储器结构。pt封装指向内存结构本身的指针,而不是Test对象。当您访问pt.contents时,会创建一个新的Test对象,并在每次访问该对象时返回该对象以包装该地址的内存结构。它不是存储属性的原始Test对象。

请注意,以下对象的ID都不同:

import ctypes
class Test(ctypes.Structure):
_fields_ = (("value", ctypes.c_int), )
def __init__(self,  *args, **kwargs):
self.vars_len = 1
super().__init__(*args, **kwargs)
t = Test(5)
pt = ctypes.pointer(t)
print(id(t))
a = pt.contents
b = pt.contents
c = pt.contents
print(id(a))
print(id(b))
print(id(c))

输出:

2453287249216
2453287249472
2453275065920
2453287248448

存储器结构需要具有数据本身的长度,并且由_fields_引用。

最新更新