1
resposta

Meu código ficou assim:

Fiquei com dúvida porque se colocar self dentro do parênteses na linha de código >>>data_completa.formatada(self), dá erro no código?

class Data():
    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano

    def formatada(self):
        print(f'{self.dia :02d} / {self.mes :02d} / {self.ano}')

from datas import Data
data_completa = Data(21, 11, 2007)
data_completa.formatada()
21/11/2007
data_completa1 = Data(2, 2, 2021)
data_completa1.formatada()
02/02/2021
1 resposta

O atributo self é colocado automaticamente pelo interpretador do python quando você chama um metodo, referenciando a instância que está chamando ele. Dessa maneira, quando você chama apenas data_completa.formatada() o interpretador coloca a instância do objeto nos argumentos para você, transformando a chamada anterior em data_completa.formatada(data_completa), que é o resultado esperado.

Ao chamar o metodo colocando explicitamente um argumento chamado de self data_completa.formatada(self) o que acontece na hora da interpretação é data_completa.formatada(data_completa, self) e isso gera um erro pois a função foi definida para receber apenas um único parametro, além de um segundo erro que é não existir nenhuma variável definida com o nome de self no seu código e você está tentando usar ela.

Leia sobre parametros e argumentos para entender melhor a diferença entre o self que você definiu no metodo e o self que você está tentando passar na chamada da função.