类成员或实例属性?

2024-07-05 10:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直在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

Tags: testlibtype成员ctypesusersdictclass
1条回答
网友
1楼 · 发布于 2024-07-05 10:40:39

testAcknowledgeHeader类上的数据描述符对象。在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。你知道吗

相关问题 更多 >