Думаю, проще всего это будет показать на примере, но вопрос общий. Скажем, я использую такую библиотеку, как 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
, но, похоже, должен быть способ получше. Есть?!
__init__
должен выйти из строя, выдавая ошибку? - person jonrsharpe   schedule 08.10.2014try:ps=PowerSupply(); except: do_something_else()
... и init обязательно должен вызвать ошибку о том, что источник питания не найден - person Joran Beasley   schedule 08.10.2014open_resource
может вернутьNone
. Так что нет,__init__
в этом случае не подведёт. Но исправление состоит в том, чтобы сделать сбой в этом случае. Добавьтеif not self.ps: raise SomeException('failed to open resource')
или что-то подобное. - person abarnert   schedule 08.10.2014PowerSupply
от своего ресурса, внедрив его в метод__init__()
вместо того, чтобы создавать его там. Таким образом, вы можете переключать реализацию, пока интерфейс совместим. - person P3trus   schedule 13.01.2015