2

我正在开发一个与功率分析仪和其他两个设备对话的 PyVISA 程序。我可以使用以下方法成功查询分析器:

import pyvisa
my_instrument = pyvisa.ResourceManager().open_resource('USB0::0x0B21::0x0025::39314C383030313939::INSTR')
print(my_instrument.query(':NUMeric:VAL?'))

我想这样包装:

import pyvisa
class YOKO( pyvisa.resources.usb.USBInstrument ):

    def __init__(self):
        pyvisa.ResourceManager().open_resource('USB0::0x0B21::0x0025::39314C383030313939::INSTR')

我在一个单独的文件中实例化该类,并调用相同的查询 - 但无济于事。我经历了一些语法变化,但我不断收到错误:

AttributeError: 'YOKO' object has no attribute 'visalib'

有人知道我在做什么错吗?如何包装 PyVISA 设备?

4

1 回答 1

4

__init__1) 你应该在 YOKO's 的第一行调用 USBInstrument 's __init__。这样做应该注意设置visalib为它的预期值。(cf:为什么不自动调用 Python 的超类 __init__ 方法?

2)我不建议对 pyvisa 工具进行子类化。相反,我会将 pyvisa 仪器对象实例化为您自己的基础仪器类的属性(即使用封装而不是继承)。当你建立自己的乐器类集合时,会发生三件事:

A)你会发现你想稍微改变 pyvisa 方法的行为;例如,您可能想要配置自己的每个协议的最小超时。您可以通过简单地覆盖方法来实现这一点,但是您可能会破坏依赖于 pyvisa 工具未更改行为的调用代码。

B)你会想出自己的方法/属性名称,不小心踩到 pyvisa 仪器方法;pyvisa 有很多这样的,它们有很好的、直观的名字,会引起冲突。

C) 当您进入诸如协作仪器集或实时数据流之类的事情时,您会希望仪器具有不同数量的轻量级行为。基本上,您最终会得到超出单纯仪器 I/O 的语义和业务逻辑,并且很自然地将该逻辑放入每个仪器对象中。如果您将实际的 pyvisa 仪器对象保留为您自己仪器类的一个属性(如果需要,可以保持完全未初始化),您将有更多的自由来添加这些语义和逻辑。

第 2 项是非常主观的,但它是基于我过去几次走这条完全相同的道路的经验:D

于 2015-09-10T08:28:13.930 回答