我认为这将是最容易的例子,但问题是一个一般性的问题。假设我使用的是像PyVISA这样的库,它将GPIB设备与我的程序连接起来。我已经为每个仪器设置了一个python类,所以对于电源,我可能会有这样的东西:
import visa
class PowerSupply:
def __init__(self):
rm = visa.ResourceManager()
self.ps = rm.open_resource('GPIB0::12::INSTR')
def getVoltage(self):
return self.ps.ask('VOLT?')
def setVoltage(self,v):
self.ps.write('VOLT '+str(v))
...
ps = PowerSupply()
ps.setVoltage(10)
不幸的是,rm.open_resource
函数可能无法工作,或者如果该地址上不存在设备,则可能返回None
(在我的代码中,我实际上编写了一个函数来执行此操作)。我的问题是:编写像PowerSupply
这样的类的最佳实践是什么?如果测试self.ps
是否存在/不是None
,可以在每个方法中编写异常,但似乎必须有更好的方法。是吗?!
发布于 2014-10-08 19:38:08
如果self.ps
存在/不是None
,你可以在每一个测试self.ps
是否存在/不是None
的方法中编写异常,但似乎一定有更好的方法。是吗?!
是。按照您编写代码的方式,如果self.ps
曾经是None
,那么它将从一开始就是None
,并且再也不会改变。因此,不需要在每个方法中都测试它,只需测试一次:
def __init__(self):
rm = visa.ResourceManager()
self.ps = rm.open_resource('GPIB0::12::INSTR')
if self.ps is None:
raise PowerSupplyException('Unable to open resource GPIB0::12::INSTR')
现在,构造PowerSupply
的任何代码都必须处理该异常或准备好传播它,但是您的问题暗示open_resource
无论如何都可能引发异常,所以这不是问题。此外,这似乎是处理它的正确位置-在您的程序的顶层,无论您在哪里创建PowerSupply
以响应某些图形用户界面、命令行界面或网络命令,您都准备好处理无法创建它的问题,对吧?
任何使用已经构造好的PowerSupply
的代码都不用担心。你知道self.ps is not None
,否则你不可能从构造器中取回对象。
https://stackoverflow.com/questions/26263835
复制相似问题