我在我的代碼中使用了自定義 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”屬性來區分資料的長度,但我不想修改ctype的_fields_。還是有其他方法?
uj5u.com熱心網友回復:
你不能這樣做。 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_.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443864.html
標籤:Python python-3.x 类型
