Esse f que você coloca antes das aspas é para indicar que você tá usando o que é chamado de f-strings que é uma maneira de formatar strings que foi adicionada ao Python 3, ela permite que você concatene strings de uma maneira mais intuitiva, podendo interpolar seu código python dentro da string.
Por exemplo, vamos supor que você tenha seu nome e queira imprimir algo como "Seu nom é SEU_NOME_AQUI"
nome = "Guilherme"
print("Seu nome é " + nome)
print("Seu nome é {}".format(nome))
print("Seu nome é %s" %nome)
print(f"Seu nome é {nome}")
Todas vão te mostrar algo como "Seu nome é Guilherme", entre tanto como você pode imaginar todas elas fazem a mesma coisa só que cada uma do seu jeito, o primeiro caso por exemplo ele só vai permitir a concatenação se os dois tipos forem string (tente adicionar a variável idade e fazer algo como como print("Seu nome é " + nome " e você tem " + idade), você verá um erro por causo do tipo então você teria que converter de número para string)
Usando meu nome e idade como exemplo,
nome = "Alexandre"
idade = 19
print("Seu nome é " + nome + " e você tem " + str(idade))
print("Seu nome é {} e você tem {}".format(nome, idade))
print("Seu nome é %s e você tem %s" %(nome, str(idade)))
print(f"Seu nome é {nome} e você tem {idade}")
Note que a medida que você quer concatenar muitas coisas, alguma das maneiras se tornam muito verbosas, e a f-string se destaca aqui, já que ela foi implementada para resolver esses diversos problemas com recursos dela mesma, basicamente o ":02d" é um recurso nativo dela que permite você formatar um inteiro com casa das dezenas e unidades, aí você perguta "e como saber que é um inteiro que estou formatando?" então o "d" diz isso e o "02" diz basicamente dezenas e unidades, por isso o dia é exibido "03" e o mês "08" e não somente 3 e 8. Claro você poderia usar qualquer uma das outras formas para concatenar sua string, mas a f-string permite esse tratamento de colocar o número com dezenas e unidades de uma maneira muito simples.
Agora que você já sabe disso, você se pergunta qual o uso do ".format()" no código então? Bom de fato acredito que seja uma maneira do instrutor te sinalizar que existem outras maneiras de concatenar, tanto que o código funcionaria perfeitamente se eles fosse simplesmente assim,
class Data:
def __init__(self, dia, mes, ano):
self.dia = 3
self.mes = 8
self.ano = 2021
def imprimir_data(self):
imprime = print(f"Hoje é {self.dia:02d}/{self.mes:02d}/{self.ano:02d}, em Goiânia.")
No caso da idade com a f-string você também pode dizer quantas casas decimais você quer, vamos supor que eu tenho 19.5 anos de idade, se eu simplesmente colocar " Seu nome é {nome} e você tem {idade}" vai sair algo como 'Seu nome é Alexandre e você tem 19.5', mas e seu eu quiser mais casas? Então é bem simples!!!
nome = "Alexandre"
idade = 19.5
print(f"Seu nome é {nome} e você tem {idade:.2f}")
Como vimos anteriormente o ":" depois da variável é sua sinalização que ali em diante é como será a formatação do seu número o ".2" indica duas casas decimais e o f é basicamente uma sinalização de que é um número float e a saída será 'Seu nome é Alexandre e você tem 19.50'. Existem muitas outras coisas que f-strings fazem, elas são muito poderosas, não há porque querer aprender todas agora quanto mais você codar mais utilidade você verá nelas!!!
Boa noite Guilherme!!! E bons estudos!!!