<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def change_attributes(self, bounds, radii, colors):
 """Reinitialize the buffers, to accomodate the new attributes. This is used to change the number of cylinders to be displayed. """

        
        self.n_cylinders = len(bounds)
        self.is_empty = True if self.n_cylinders == 0 else False
        
        if self.is_empty:
            self.bounds = bounds
            self.radii = radii
            self.colors = colors
            return # Do nothing
        
        # We pass the starting position 8 times, and each of these has
        # a mapping to the bounding box corner.
        self.bounds = np.array(bounds, dtype='float32')
        vertices, directions = self._gen_bounds(self.bounds) 
        
        self.radii = np.array(radii, dtype='float32')
        prim_radii = self._gen_radii(self.radii)

        self.colors = np.array(colors, dtype='uint8')
        prim_colors = self._gen_colors(self.colors)
       
        local = np.array([
           # First face -- front
          0.0, 0.0, 0.0,
          0.0, 1.0, 0.0, 
          1.0, 1.0, 0.0,
        
          0.0, 0.0, 0.0,
          1.0, 1.0, 0.0,
          1.0, 0.0, 0.0,

          # Second face -- back
          0.0, 0.0, 1.0,
          0.0, 1.0, 1.0, 
          1.0, 1.0, 1.0,

          0.0, 0.0, 1.0,
          1.0, 1.0, 1.0,
          1.0, 0.0, 1.0,
          
          # Third face -- left
          0.0, 0.0, 0.0,
          0.0, 0.0, 1.0, 
          0.0, 1.0, 1.0,

          0.0, 0.0, 0.0,
          0.0, 1.0, 1.0,
          0.0, 1.0, 0.0,

          # Fourth face -- right
          1.0, 0.0, 0.0,
          1.0, 0.0, 1.0, 
          1.0, 1.0, 1.0,

          1.0, 0.0, 0.0,
          1.0, 1.0, 1.0,
          1.0, 1.0, 0.0,

          # Fifth face -- up
          0.0, 1.0, 0.0,
          0.0, 1.0, 1.0,
          1.0, 1.0, 1.0,

          0.0, 1.0, 0.0,
          1.0, 1.0, 1.0,
          1.0, 1.0, 0.0,
          
          # Sixth face -- down
          0.0, 0.0, 0.0,
          0.0, 0.0, 1.0,
          1.0, 0.0, 1.0,

          0.0, 0.0, 0.0,
          1.0, 0.0, 1.0,
          1.0, 0.0, 0.0,
          
        ]).astype('float32')
        
        local = np.tile(local, self.n_cylinders)
        
        self._verts_vbo = VertexBuffer(vertices,GL_DYNAMIC_DRAW)
        self._directions_vbo = VertexBuffer(directions, GL_DYNAMIC_DRAW)
        
        self._local_vbo = VertexBuffer(local,GL_DYNAMIC_DRAW)
        self._color_vbo = VertexBuffer(prim_colors, GL_DYNAMIC_DRAW)
        self._radii_vbo = VertexBuffer(prim_radii, GL_DYNAMIC_DRAW)