如何在 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_
引用。
我在我的代码中使用自定义 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_
引用。