Bot image for PythonMind

Shared conversation

PythonMind ·

Can you make an abstract parent class for this class called OSA? The child class will override virtual methods.

Sure! Here's an example abstract parent class called OSA that defines virtual methods for controlling an optical spectrum analyzer:

python
import abc

class OSA(abc.ABC):
    @abc.abstractmethod
    def set_center_wavelength(self, wavelength):
        pass
    
    @abc.abstractmethod
    def set_span(self, span):
        pass
    
    @abc.abstractmethod
    def set_resolution_bandwidth(self, rbw):
        pass
    
    @abc.abstractmethod
    def set_video_bandwidth(self, vbw):
        pass
    
    @abc.abstractmethod
    def set_sweep_points(self, points):
        pass
    
    @abc.abstractmethod
    def set_average_count(self, count):
        pass
    
    @abc.abstractmethod
    def set_average_mode(self, mode):
        pass
    
    @abc.abstractmethod
    def get_trace_data(self):
        pass

This class declares a set of methods that a concrete child class must implement to control an optical spectrum analyzer. The abc.ABC class is used to make this class an abstract base class, indicating that it cannot be instantiated directly.

To create a concrete child class that inherits from OSA and implements these methods for the Yokogawa AQ6370, you could do something like this:

python
class YokogawaAQ6370(OSA):
    def __init__(self, address):
        self.rm = visa.ResourceManager()
        self.instr = self.rm.open_resource(address)
        self.instr.read_termination = '\n'
        self.instr.write_termination = '\n'
        
    def query(self, command):
        return self.instr.query(command)
    
    def write(self, command):
        self.instr.write(command)
    
    def read(self):
        return self.instr.read()
    
    def reset(self):
        self.write('*RST')
    
    def set_center_wavelength(self, wavelength):
        self.write(f':SENS:WAV:CEN {wavelength:.3f}')
        
    def set_span(self, span):
        self.write(f':SENS:WAV:SPAN {span:.3f}')
        
    def set_resolution_bandwidth(self, rbw):
        self.write(f':SENS:BAND:RES {rbw:.3f}')
        
    def set_video_bandwidth(self, vbw):
        self.write(f':SENS:BAND:VID {vbw:.3f}')
    
    def set_sweep_points(self, points):
        self.write(f':SENS:SWE:POIN {points:d}')
    
    def set_average_count(self, count):
        self.write(f':SENS:AVER:COUN {count:d}')
    
    def set_average_mode(self, mode):
        if mode.lower() == 'on':
            self.write(':SENS:AVER ON')
        elif mode.lower() == 'off':
            self.write(':SENS:AVER OFF')
        else:
            raise ValueError(f'Invalid average mode: {mode}')
    
    def get_trace_data(self):
        data = self.query(':TRAC:DATA? TRACE1')
        return [float(x) for x in data.split(',')]

By inheriting from OSA and implementing all the virtual methods, the YokogawaAQ6370 class can now be used as a concrete class that controls the Yokogawa AQ6370 optical spectrum analyzer.

This conversation may have been edited by the sharer.

Bot image for PythonMindTalk to PythonMind on Poe