Um ponto fundamental da programação orientada a objetos: a responsabilidade de uma classe.
A melhor prática é que o método lista_restaurantes() seja colocado fora da classe Restaurante.
Por que fora da classe?
A classe Restaurante deve ser responsável apenas por representar um único restaurante. Seus atributos (nome, endereço etc) e métodos devem se referir às características e comportamentos de uma instância individual.
Se você colocar o método lista_restaurantes() dentro da classe, estará violando o princípio de responsabilidade única. A classe passaria a ter duas responsabilidades:
Gerenciar as características de um restaurante individual.
Gerenciar a coleção de todos os restaurantes.
Isso pode levar a um design confuso e difícil de manter.
Onde colocar o método, então?
A solução mais comum e elegante é criar um gerenciador de restaurantes, que pode ser outra classe ou uma função simples.
Opção 1: Usando uma lista global e uma função
Essa é a abordagem mais direta para o seu problema. Você pode criar uma lista fora da classe para armazenar todos os objetos, e uma função para imprimi-los.
Acredito que o curso deveria reforçar as boas prátiacas de OO já que o tema é justamente Python com OO, nesse ponto eu acredito que essa seja uma oportunidade de melhoria do conteúdo.