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?