You are passing self.params to the optimizer in:
optimizer = torch.optim.SGD(self.params, lr=0.01)

which is why they get updated.
As a side note: you could create trainable parameters via nn.Parameter, which would properly register them inside the module and then pass all parameters via model.parameters() to the optimizer, which would avoid creating the list manually.