Perhaps the most important attribute of the GPR class is the $\texttt{kernel}$ attribute. This associates the GP with a particular kernel function. Here are 3 possibilities for the kernel function:
\begin{align*}
\textit{Linear}: \quad &k(\mathbf{x}_i, \mathbf{x}_j) = \sigma_f^2\mathbf{x}_i^T \mathbf{x}_j \\
\textit{Squared Exponential}: \quad &k(\mathbf{x}_i, \mathbf{x}_j) = \text{exp} \left(\frac{-1}{2l^2} (\mathbf{x}_i - \mathbf{x}_j)^T (\mathbf{x}_i - \mathbf{x}_j)\right) \\
\textit{Periodic}: \quad &k(\mathbf{x}_i, \mathbf{x}_j) = \text{exp}\left(-\sin(2\pi f(\mathbf{x}_i - \mathbf{x}_j))^T \sin(2\pi f(\mathbf{x}_i - \mathbf{x}_j))\right)
\end{align*}
You can prove for yourself that each of these kernel functions is valid i.e. that they construct symmetric positive semi-definite covariance matrices. For example, the covariance matrix associated with the linear kernel is simply $\sigma_f^2XX^T$, which is indeed symmetric positive semi-definite.
Each kernel function is housed inside a class. The $\_\_\texttt{call}\_\_$ function of the class constructs the full covariance matrix $K(X1, X2) \in \mathbb{R}^{n_1 \times n_2}$ by applying the kernel function element-wise between the rows of $X1 \in \mathbb{R}^{n_1 \times D}$ and $X2 \in \mathbb{R}^{n_2 \times D}$. Note that $X1$ and $X2$ are identical when constructing the covariance matrices of the GP f.d.ds introduced above, but in general we allow them to be different to facilitate what follows. The element-wise computations could be implemented with simple for loops over the rows of $X1$ and $X2$, but this is inefficient. Instead we use the simple vectorized form $K(X1, X2) = \sigma_f^2X_1X_2^T$ for the linear kernel, and numpy's optimized methods $\texttt{pdist}$ and $\texttt{cdist}$ for the squared exponential and periodic kernels.
Each kernel class has an attribute $\texttt{theta}$, which stores the parameter value of its associated kernel function ($\sigma_f^2$, $l$ and $f$ for the linear, squared exponential and periodic kernels respectively), as well as a $\texttt{bounds}$ attribute to specify a valid range of values for this parameter. $\texttt{theta}$ is used to adjust the distribution over functions specified by each kernel, as we shall explore below.