<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def seek(self, n_bytes, from_what=os.SEEK_SET):
 """Seek to a new position in the memory region. Parameters n_bytes : int Number of bytes to seek. from_what : int As in the Python standard: `0` seeks from the start of the memory region, `1` seeks from the current position and `2` seeks from the end of the memory region. For example:: mem.seek(-1, 2) # Goes to the last byte in the region mem.seek(-5, 1) # Goes 5 bytes before that point mem.seek(0) # Returns to the start of the region Note that `os.SEEK_END`, `os.SEEK_CUR` and `os.SEEK_SET` are also valid arguments. """

        if from_what == 0:
            self._offset = n_bytes
        elif from_what == 1:
            self._offset += n_bytes
        elif from_what == 2:
            self._offset = (self._end_address - self._start_address) - n_bytes
        else:
            raise ValueError(
                "from_what: can only take values 0 (from start), "
                "1 (from current) or 2 (from end) not {}".format(from_what)
            )