2
respostas

[Dúvida] @classmethod entendimento

Olá, se o decorador @classmethod é utilizado para criar um método para utilizar na CLASSE e não na INSTÂNCIA, porque eu consigo chama-lo ainda dessa forma:

Segue meu código completo:

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}"

    @staticmethod
    def listar_restaurantes(cls):
        """
        Método da classe, e não da instancia
        """
        print(f"{'Restaurante'.ljust(25)}  {'Categoria'.ljust(25)}  {'Status'}")
        for restaurante in cls.restaurantes:
            print(f"{restaurante._nome.ljust(25)}  {restaurante._categoria.ljust(25)}  {restaurante.ativo}")

    @property
    def ativo(self):
        """
        Quando eu utilizar o atributo ativo, irá devolver uma das opções desse método.
        """
        return "aberto" if self._ativo else "fechado"

    def alternar_estado(self):
        self._ativo = not self._ativo


pizzaria = Restaurante("Pizza Express", "Italiano")
pizzaria.alternar_estado()
lanchonete = Restaurante("Jump Burguer", "Hamburgueria")
acai = Restaurante("Açai Express", "Sorveteria")
# 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(Restaurante)
pizzaria.listar_restaurantes(pizzaria)

veja que na ultima linha coloquei o trecho:

pizzaria.listar_restaurantes(pizzaria)

O mesmo me retornar exatamente a mesma informação do:

Restaurante.listar_restaurantes(Restaurante)

Está correto? É isso mesmo meu entendimento?

2 respostas

Complementando. Eu posso fazer isso PORÉM não faz sentido, esse é o entendimento?

Olá, Willian! Tudo bem?

Sua dúvida é bastante pertinente e mostra que você está realmente se aprofundando no entendimento dos conceitos de orientação a objetos em Python.

O decorador @classmethod é utilizado para criar um método ligado à classe e não à instância. No entanto, isso não significa que você não possa chamar esse método a partir de uma instância.

Quando você chama pizzaria.listar_restaurantes(pizzaria), o Python entende que você está chamando o método listar_restaurantes da classe Restaurante (pois pizzaria é uma instância dessa classe) e passando a própria instância pizzaria como argumento.

Agora, quando você chama Restaurante.listar_restaurantes(Restaurante), você está chamando o método diretamente da classe e passando a própria classe como argumento.

Embora pareça estranho, isso é perfeitamente válido em Python. A principal diferença aqui é que, ao chamar o método a partir da instância, você tem a possibilidade de acessar os atributos e métodos específicos dessa instância, se necessário.

No entanto, no seu caso específico, como o método listar_restaurantes não faz uso de nenhum atributo ou método específico da instância, o resultado é o mesmo, independentemente de você chamar o método a partir da classe ou da instância.

Espero ter ajudado e bons estudos!

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