gpt4 book ai didi

python - 类成员还是实例属性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:46:18 24 4
gpt4 key购买 nike

我最近一直在使用 ctypes 中的 Structure,但我遇到了一个奇怪的问题。

这是我的 Python3 代码:

from ctypes import *
class AcknowledgeHeader(Structure):
_fields_ = [
('test', c_uint8),
]
ack_header = AcknowledgeHeader()

问题是:test是AcknowledgeHeader的类成员还是ack_header的实例属性?

我试图找到答案。

如果test是ack_header的一个实例属性,那么为什么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

最佳答案

testAcknowledgeHeader 上的数据描述符对象类(class)。在 ack_header 上访问它实例导致代码运行,在 C 约定和 Python 类型之间进行转换。

因为它是一个数据描述符,所有与属性的交互都会被捕获,包括删除和赋值。如果你要设置 'test'键入 ack_header.__dict__属性字典它会被忽略。

相反,ack_header.test将始终调用 AcknowledgeHeader.test.__get__(ack_header, AcknowledgeHeader) , 同时分配给 ack_header.test将触发 AcknowledgeHeader.test.__set__(ack_header, <new value>) .

本例中只实现了获取和设置,没有 _ctypes.CField.__delete__() method , 只有 __get____set__ , 所以 del ack_header.test将抛出异常。

参见 descriptor HOWTO有关描述符如何工作的更多详细信息。

关于python - 类成员还是实例属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49026115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com