1
resposta

[Dúvida] Desenvolvimento

class Restaurante:
    nome = ''
    categoria = ''
    ativo = False

restaurante_praca = Restaurante()
restaurante_praca.nome = 'Praça'
restaurante_praca.categoria = "Gourmet"

restaurante_pizza = Restaurante()

restaurantes = [restaurante_praca, restaurante_pizza]

print(vars(restaurante_praca))
  • Qual é a diferença entre atributos da classe e atributos do objeto nesse exemplo?
  • Por que os atributos nome, categoria e ativo foram definidos diretamente na classe e não em um __init__?
  • O que a função vars(restaurante_praca) retorna exatamente?
  • Qual seria a diferença entre usar vars(restaurante_praca) e restaurante_praca.__dict__?
  • Se eu mudar Restaurante.nome = 'Teste', isso afeta os objetos já criados?
  • Por que é possível adicionar atributos a um objeto mesmo que eles já existam na classe?
  • Como esse código poderia ser melhorado usando um método __init__?
  • Qual é a diferença entre criar vários objetos da classe Restaurante e reutilizar o mesmo objeto?
1 resposta

Oi Lucas! Espero que eu consiga ajudá-lo:

Qual é a diferença entre atributos da classe e atributos do objeto nesse exemplo?
R: Os atributos definidos diretamente na classe (nome, categoria, ativo) são atributos de classe, ou seja, pertencem à classe e servem como valores padrão para todos os objetos. Já quando fazemos algo como restaurante_praca.nome = 'Praça', esse atributo passa a ser do objeto, existindo só naquela instância específica.

Por que os atributos nome, categoria e ativo foram definidos diretamente na classe e não em um init?
R: Nesse caso é apenas didático, para mostrar que uma classe pode existir sem construtor. Funciona tá? Mas não é o ideal. Sem init, os objetos podem ser criados “incompletos”, dependendo de atribuições feitas depois. Em projetos reais, o mais comum é usar o init.

O que a função vars(restaurante_praca) retorna exatamente?
R: Retorna um dicionário com os atributos do objeto, ou seja, apenas aquilo que pertence diretamente à instância. No exemplo, aparecem nome e categoria, mas não ativo, porque ativo ainda está vindo da classe.

Qual seria a diferença entre usar vars(restaurante_praca) e restaurante_praca.dict?
R: Nenhuma diferença. Os dois retornam exatamente o mesmo dicionário interno do objeto. O vars() é só uma forma mais limpa e recomendada de acessar isso, para uma boa prática.

Se eu mudar Restaurante.nome = 'Teste', isso afeta os objetos já criados?
R: Afeta apenas os objetos que não têm o atributo nome definido diretamente neles. Se o objeto já tiver nome próprio, ele continua usando o valor dele. O Python sempre prioriza o atributo do objeto antes do atributo da classe.

Por que é possível adicionar atributos a um objeto mesmo que eles já existam na classe?
R: Porque em Python os objetos são dinâmicos. Quando você faz objeto.atributo = valor, o atributo é criado (ou sobrescrito) no próprio objeto, sem mexer na classe. Isso é comportamento padrão da linguagem.

Como esse código poderia ser melhorado usando um método init?
R: class Restaurante:
def init(self, nome, categoria, ativo=False):
self.nome = nome
self.categoria = categoria
self.ativo = ativo

Qual é a diferença entre criar vários objetos da classe Restaurante e reutilizar o mesmo objeto?
R: Criar vários objetos significa ter restaurantes independentes, cada um com seus próprios dados. Reutilizar o mesmo objeto é só alterar os valores de uma única instância, o que normalmente não representa bem entidades diferentes no mundo real.