如何在 ctypes.pointer.contents 中设置属性?

How to setattr in ctypes.pointer.contents?

我在我的代码中使用自定义 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 中设置属性? 我想实现一个自定义的 ctypes,它是一个可变长度点,具有“vars_len”属性来区分数据的长度,但我不想修改 ctype 的_fields_。 或者有别的办法吗?

你不能这样做。 Test 包装一个内存结构。 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_ 引用。