Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类成员还是实例属性?_Python_Python 3.x_Python 2.7_Ctypes - Fatal编程技术网

Python 类成员还是实例属性?

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

最近我在ctypes中使用了结构,但我有一个奇怪的问题

这是我的Python3代码:

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