That would use the initial hidden state for every call of the forward pass regardless of the value of the hidden argument passed to forward.
How about this?
def forward(self, input, hidden):
    if hidden is None:
        hidden = self.hidden0
    output, hidden = self.rnn(input, self.hidden0)
    ...

And your training loop would look a little like this… (assuming you pass the data to your Encoder one timestep at a time).
hidden = None
for timestep in inputs:
    output, hidden = model(input, hidden)
    ...