1
resposta

método listar_restaurante()

Olá, tenho uma dúvida, meu código está funcionando normalmente conforme esperado, porém notei que o Pycharm apresenta uma sugestão como se fosse uma espécie de erro o que estou realizando:

class Restaurante:
    restaurantes = []

    def __init__(self, nome, categoria):
        self.nome = nome
        self.categoria = categoria
        self.ativo = False
        Restaurante.restaurantes.append(self)  # Quando utilizar o construtor já irá guardar na lista o restaurante

    def __str__(self):
        """
        Este método, converte para string e retorna em tela, para que não seja apresentada
        a referente em memória
        :return:
        """
        return f"{self.nome}, {self.categoria}"

    def listar_restaurantes():
        for restaurante in Restaurante.restaurantes:
            print(f"{restaurante.nome} | {restaurante.categoria} | {restaurante.ativo}")


pizzaria = Restaurante("Pizza Express", "Italiano")
#print(pizzaria)
# Ao realizar o print dessa forma (sem existir o método __str__)
# irá trazer a referencia de memória do objeto instanciado

Restaurante.listar_restaurantes()

Estes dois pontos são onde apresentam a possível correção, ao manter o mouse parado acima:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E também ao manter o mouse acima do ():

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Porque o Pycharm tenta corrigir isso? Ele sempre espera que todos métodos dentro da classe tenham o self?

1 resposta

Olá Willian! Tudo bem?

Vamos entender o que está acontecendo.

O PyCharm, assim como outras IDEs, tem ferramentas de análise de código que ajudam a identificar possíveis melhorias ou práticas comuns em Python.

No primeiro caso, o PyCharm sugere que o método listar_restaurantes poderia ser estático, ou seja, um método estático (staticmethod) não espera receber uma instância específica da classe como primeiro argumento (o self). Isso faz sentido nesse contexto porque o método não utiliza o self em nenhum momento, já que ele opera diretamente sobre a variável de classe restaurantes.

Para transformar listar_restaurantes em um método estático, você pode usar o decorador @staticmethod acima da definição do método, assim:

@staticmethod
def listar_restaurantes():
    for restaurante in Restaurante.restaurantes:
        print(f"{restaurante.nome} | {restaurante.categoria} | {restaurante.ativo}")

Já no segundo caso, o PyCharm indica que métodos devem ter um parâmetro inicial, que por convenção é chamado de self. Isso é verdade para métodos de instância, chamados em uma instância específica da classe e usam dados dessa instância. No entanto, como listar_restaurantes está trabalhando com uma variável da classe e não com uma instância, ele não precisa do self.

De maneira geral, o PyCharm está tentando orientá-lo para seguir as convenções e práticas recomendadas em Python. Mas se você aplicar ou não essas recomendações o seu código irá rodar sem problemas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.