Python 类成员还是实例属性?
最近我在ctypes中使用了结构,但我有一个奇怪的问题 这是我的Python3代码:Python 类成员还是实例属性?,python,python-3.x,python-2.7,ctypes,Python,Python 3.x,Python 2.7,Ctypes,最近我在ctypes中使用了结构,但我有一个奇怪的问题 这是我的Python3代码: from ctypes import * class AcknowledgeHeader(Structure): _fields_ = [ ('test', c_uint8), ] ack_header = AcknowledgeHeader() 问题是:test是AcknowledgeHeader的类成员还是ack_头的实例属性 我试图找到答案 如果test是ack\u he
from ctypes import *
class AcknowledgeHeader(Structure):
_fields_ = [
('test', c_uint8),
]
ack_header = AcknowledgeHeader()
问题是:test
是AcknowledgeHeader的类成员还是ack_头的实例属性
我试图找到答案
如果test
是ack\u header的实例属性,那么为什么ack\u header.\uuuuuuu dict\uuuuu
打印一个空的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的类成员,那么为什么类型(ack_header.test)
不等于类型(AcknowledgeHeader.test)
如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
确认头=确认头()
打印(类型(确认页眉测试))
打印(类型(确认标题测试))
C:\Users\Administrator\PycharmProjects\gige lib\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/gige lib/channel/common.py
进程已完成,退出代码为0
test
是ackknowledgeheader
类上的数据描述符对象。在ack_header
实例上访问它会导致代码在C约定和Python类型之间转换
因为它是一个数据描述符,所以会捕获与属性的所有交互,包括删除和分配。如果您要在ack\u头中设置'test'
键。\uuuuu dict\uuuu
属性字典,它将被忽略
相反,ack\u header.test
将始终调用ackknowledgeheader.test.\uu获取(ack\u header,ackknowledgeheader)
,而分配给ack\u header.test
将触发ackknowledgeheader.test.\uu设置(ack\u header,)
在这种情况下,只执行获取和设置,没有,只有\uuuuu获取\uuuuuuu
和\uuuu设置\uuuuu
,因此del ack\u header.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