首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类中包装pyvisa设备

在类中包装pyvisa设备
EN

Stack Overflow用户
提问于 2015-06-24 05:13:46
回答 1查看 983关注 0票数 2

我正在开发一个PyVISA程序,它可以与电源分析仪和另外两个设备进行对话。我可以使用以下命令成功查询分析器:

代码语言:javascript
复制
import pyvisa
my_instrument = pyvisa.ResourceManager().open_resource('USB0::0x0B21::0x0025::39314C383030313939::INSTR')
print(my_instrument.query(':NUMeric:VAL?'))

我想这样包装它:

代码语言:javascript
复制
import pyvisa
class YOKO( pyvisa.resources.usb.USBInstrument ):

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

我在一个单独的文件中实例化了这个类,并调用了相同的查询--但没有用。我已经经历了一些语法变体,但我一直收到错误:

代码语言:javascript
复制
AttributeError: 'YOKO' object has no attribute 'visalib'

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

EN

回答 1

Stack Overflow用户

发布于 2015-09-10 16:28:14

1)在YOKO的__init__的第一行调用USBInstrument的__init__。这样做应该注意将visalib设置为其预期值。(cf:Why aren't Python's superclass __init__ methods automatically invoked?)

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

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

B)你会想出你自己的方法/属性名称,这些方法/属性名称会意外地踩到pyvisa工具方法上;pyvisa有很多这样的方法/属性名称,它们的名字很漂亮,很直观,容易引起冲突。

C)当您进入协作仪器集或实时数据流时,您将希望您的仪器具有不同数量的轻量级行为。基本上,您最终得到的语义和业务逻辑不仅仅是仪器I/O,而且将该逻辑放入每个仪器对象中是很自然的。如果您只将实际的pyvisa instrument对象作为您自己的instrument类的一个属性(如果需要,可以完全不初始化),那么您将有更多的自由在中添加这些语义和逻辑。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31013641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档