2
respostas

Consegui fazer formatar corretamente, mas imprime também a localização na memória

class Data:
    def __init__(self, dia, mes, ano):
        print("{}/{}/{}".format(dia, mes, ano))



from datas import Data
d = Data(21,11,2007)
print(d)

Resultado:

21/11/2007 <datas.Data object at 0x00000282CEC19250> 21/11/2007 <datas.Data object at 0x00000282CEC3A7C0>

Process finished with exit code 0

2 respostas

Experimenta colocar o self nas variáveis do print (self.dia, self.mes, self.ano), creio que falte isso pra não ocorrer esse erro.

A saída está correta para a forma que você chamou, apesar de não ser o resultado esperado.

O que ocorre é que o método __init__ é um construtor e tem uma convenção em sua implementação para ele apenas construir o objeto.

d = Data(21, 11, 2007) cria uma instância da classe Data chamando o construtor e atribui a referência em memória do objeto à variável d.

Quando chama o print(d), ele invoca o método __str__ da classe Data herdado de Object. Como não foi sobrescrito, ele imprime na tela o objeto e suas referencias de classe e memória.

Para imprimir corretamente, faça o construtor apenas construir o objeto e sobrescreva o método __str__ retornando a string desejada.

Criei essa implementação para o problema adaptando a forma como você fez:

Em datas.py

class Data:

    def __init__(self, dia: int, mes: int, ano: int):
        self.__dia = dia
        self.__mes = mes
        self.__ano = ano

    @property
    def dia(self):
        return self.__dia

    @property
    def mes(self):
        return self.__mes

    @property
    def ano(self):
        return self.__ano

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

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

Em main.py

from datas import Data

if __name__ == "__main__":
    d = Data(21, 11, 2007)
    d.formadata()
    print(d)

Tanto d.formadata() quanto print(d) imprimem na tela o resultado esperado.