我最近一直在ctypes中使用结构,但我有一个奇怪的问题。你知道吗
这是我的Python3代码:
from ctypes import *
class AcknowledgeHeader(Structure):
_fields_ = [
('test', c_uint8),
]
ack_header = AcknowledgeHeader()
问题是:test
是ackknowledgeheader的类成员还是ack\u头的实例属性?你知道吗
我试图找到答案。你知道吗
如果test
是ack\u头的实例属性,那么为什么ack_header.__dict__
打印一个空的dict?你知道吗
if __name__ == '__main__':
ack_header = AcknowledgeHeader()
print(ack_header.__dict__)
C:\Users\Administrator\PycharmProjects\gige-lib\venv\Scripts\python.exe
C:/Users/Administrator/PycharmProjects/gige-lib/channel/common.py
{}
Process finished with exit code 0
如果test
是AcknowledgeHeader的类成员,那么为什么type(ack_header.test)
不等于type(AcknowledgeHeader.test)
?你知道吗
if __name__ == '__main__':
ack_header = AcknowledgeHeader()
print(type(ack_header.test))
print(type(AcknowledgeHeader.test))
C:\Users\Administrator\PycharmProjects\gige-lib\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/gige-lib/channel/common.py
<class 'int'>
<class '_ctypes.CField'>
Process finished with exit code 0
test
是AcknowledgeHeader
类上的数据描述符对象。在ack_header
实例上访问它会导致在C约定和Python类型之间转换的代码运行。你知道吗因为它是一个数据描述符,所有与属性的交互都被捕获,包括删除和赋值。如果要在
ack_header.__dict__
属性字典中设置一个'test'
键,那么它将被忽略。你知道吗相反,
ack_header.test
将始终调用AcknowledgeHeader.test.__get__(ack_header, AcknowledgeHeader)
,而对ack_header.test
的赋值将触发AcknowledgeHeader.test.__set__(ack_header, <new value>)
。你知道吗在这种情况下,只实现get和setting,没有^{} method ,只有
__get__
和__set__
,所以del ack_header.test
会抛出异常。你知道吗有关描述符如何工作的更多详细信息,请参见descriptor HOWTO。你知道吗
相关问题 更多 >
编程相关推荐