Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] relacionado a instancia

Boa noite, poderiam me explicar como funciona a instancia? Tambem tenho duvida em relação ao seguinte codigo:

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

Ok, estamos percorrendo a lista de restaurante, porém, ela é criada dentro de uma classe e incrementada dentro de uma função, poderiam me explicar se, no ato de incremento(append), ele salva como se fosse uma variavel de escopo global na variavel de lista?

4 respostas

Olá, Eduardo.

Tudo bem?

Em Python, uma instância é um objeto que é criado a partir de uma classe. Quando você cria uma classe, está definindo um "molde" para os objetos que serão criados a partir dela. Cada objeto criado a partir dessa classe é uma instância dessa classe.

Incremento da Lista

No seu código, você tem uma classe Restaurante com uma variável de classe chamada restaurantes, que é uma lista. Essa lista é compartilhada por todas as instâncias da classe Restaurante.

Quando você cria uma nova instância de Restaurante, o método __init__ é chamado, e dentro dele, você está adicionando a nova instância (self) à lista Restaurante.restaurantes usando append.

Aqui está um exemplo prático para ilustrar:

class Restaurante:
    restaurantes = []  # Variável de classe

    def __init__(self, nome, categoria):
        self.nome = nome
        self.categoria = categoria
        self.ativo = False
        Restaurante.restaurantes.append(self)  # Adiciona a instância atual à lista de restaurantes
    
    def __str__(self):
        return f'{self.nome} | {self.categoria}'

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

# Criando instâncias de Restaurante
restaurante_praca = Restaurante('Praça', 'Gourmet')
restaurante_pizza = Restaurante('Pizza Express', 'Italiana')

# Listando os restaurantes
Restaurante.listar_restaurantes()

Explicação

  1. Variável de Classe: restaurantes = [] é uma variável de classe, o que significa que ela é compartilhada por todas as instâncias da classe Restaurante.

  2. Método __init__: Quando você cria uma nova instância de Restaurante (por exemplo, restaurante_praca), o método __init__ é executado. Dentro desse método, a instância atual (self) é adicionada à lista Restaurante.restaurantes usando append.

  3. Método listar_restaurantes: Esse método percorre a lista Restaurante.restaurantes e imprime as informações de cada restaurante.

Resposta à sua Pergunta

Sim, quando você usa Restaurante.restaurantes.append(self) dentro do método __init__, a instância atual (self) é adicionada à lista de classe restaurantes. Essa lista é, de fato, acessível globalmente dentro do contexto da classe Restaurante.

Espero ter entendido e conseguido ajudar. Qualquer dúvida manda aqui. Bons estudos.

Ok, então, entao, ela existe apenas dentro da classe? voce disse que ela é compartilhada entao, toda vez que for criada uma instancia de objeto:

restaurante_praca = Restaurante('Praça', 'Gourmet')
restaurante_pizza = Restaurante('Pizza Express', 'Italiana')

é armazenado dentro da variavel compartilhada? A proposito, meu conceito de instancia essa certo? restaurante_pizza = Restaurante('Pizza Express', 'Italiana')

Opa Eduardo.

Sobre a existência da lista dentro da classe: Sim, a lista restaurantes existe dentro do contexto da classe Restaurante. Ela é uma variável de classe, o que significa que é compartilhada por todas as instâncias da classe. Isso quer dizer que, quando você cria uma nova instância de Restaurante, essa instância será adicionada à lista restaurantes, que é compartilhada por todas as outras instâncias.

Armazenamento na variável compartilhada: Correto! Toda vez que você cria uma nova instância, como restaurante_praca ou restaurante_pizza, essa instância é armazenada na lista compartilhada Restaurante.restaurantes. Isso significa que todas as instâncias estão acessíveis através dessa lista, independentemente de onde ou quando foram criadas, enquanto o programa estiver rodando.

Sobre o conceito de instância: Sim, seu entendimento sobre instância está correto. Quando você escreve:

restaurante_pizza = Restaurante('Pizza Express', 'Italiana')

Você está criando uma instância da classe Restaurante. Essa instância é um objeto específico que contém os atributos e comportamentos definidos pela classe. No exemplo, restaurante_pizza é um objeto que possui os atributos nome, categoria e ativo, conforme definidos na classe Restaurante.

Se precisar de mais alguma coisa, estou aqui para ajudar. Bons estudos!

solução!

Muito obrigado, sua explicação foi muito boa, acabei de perceber que estou indo no caminho certo : )