Eu apenas acrescentei um if verificando o tamanho do número.
Se o tamanho for 12 é um telefone fixo, se for 13 é um celular, aí é só trocar o padrão.
def formata(self):
if len(self.numero) == 12:
padrao = '([0-9]{2,3})?([0-9]{2})([0-9]{4})([0-9]{4})' # fixo
else:
padrao = '([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})' # celular
resposta = re.search(padrao, self.numero)
numero_formatado = '+{}({}){}-{}'.format(
resposta.group(1),
resposta.group(2),
resposta.group(3),
resposta.group(4)
)
return numero_formatado