Atributos de Instância vs. Atributos de Classe

Na Programação Orientada a Objetos (POO), a compreensão da diferença entre atributos de instância e de classe é fundamental para a estruturação adequada dos programas. Nesta secção, vamos explorar o que são esses atributos, como os utilizar e em que contextos são mais apropriados.

Atributos de Instância

Os atributos de instância são variáveis que pertencem a uma instância específica de uma classe. Cada objecto criado a partir de uma classe pode ter valores diferentes para esses atributos. Vamos ver um exemplo prático em Python.

class Carro:
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo

# Criação de objectos
carro1 = Carro('Toyota', 'Corolla')
carro2 = Carro('Honda', 'Civic')

print(carro1.marca)  # Output: Toyota
print(carro2.marca)  # Output: Honda

Neste exemplo, marca e modelo são atributos de instância. Cada objecto Carro pode ter valores diferentes para esses atributos.

Atributos de Classe

Os atributos de classe, por outro lado, são variáveis que são compartilhadas por todas as instâncias de uma classe. Ou seja, o mesmo valor é partilhado por todos os objectos dessa classe. Vamos considerar o seguinte exemplo:

class Carro:
    rodas = 4  # Este é um atributo de classe

    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo

# Criação de objectos
carro1 = Carro('Toyota', 'Corolla')
carro2 = Carro('Honda', 'Civic')

print(carro1.rodas)  # Output: 4
print(carro2.rodas)  # Output: 4

# Alteração do atributo de classe
Carro.rodas = 3

print(carro1.rodas)  # Output: 3
print(carro2.rodas)  # Output: 3

Aqui, rodas é um atributo de classe. Quando alteramos Carro.rodas, a mudança reflecte-se em todas as instâncias da classe Carro.

Diferenças Principais Entre Atributos de Instância e de Classe

  • Alcance (scope) e Acesso: Os atributos de instância são acessíveis apenas através da instância, enquanto os atributos de classe podem ser acedidos tanto pela classe quanto pelas instâncias.

  • Memória: Atributos de instância são armazenados separadamente para cada instância, ao passo que atributos de classe são armazenados apenas uma vez e partilhados entre todas as instâncias.

  • Utilização: Utilize atributos de instância quando os valores precisam ser únicos por objecto. Use atributos de classe para valores ou parâmetros que devem ser partilhados por todas as instâncias de uma classe.

Exemplo Prático

Vamos criar um exemplo mais complexo que ilustra a utilização conjunta de atributos de instância e de classe para modelar um sistema simples de biblioteca:

class Biblioteca:
    total_livros = 0  # Atributo de classe

    def __init__(self, nome):
        self.nome = nome
        self.livros = []
        Biblioteca.total_livros += len(self.livros)

    def adicionar_livro(self, livro):
        self.livros.append(livro)
        Biblioteca.total_livros += 1

# Criação de instâncias da biblioteca
biblioteca1 = Biblioteca('Biblioteca Central')
biblioteca2 = Biblioteca('Biblioteca Local')

biblioteca1.adicionar_livro('1984')
biblioteca2.adicionar_livro('Brave New World')

print(Biblioteca.total_livros)  # Output: 2
print(biblioteca1.livros)  # Output: ['1984']
print(biblioteca2.livros)  # Output: ['Brave New World']

Resumo

Os atributos de instância e de classe oferecem formas distintas de armazenar e gerir dados numa classe. A escolha entre eles depende do comportamento desejado e das necessidades do seu programa. Atributos de instância são específicos para cada objecto, enquanto atributos de classe são partilhados por todas as instâncias.

Quiz

  1. Qual a diferença principal entre um atributo de instância e um atributo de classe?

    • a) Os atributos de instância são específicos para cada objecto, enquanto os atributos de classe são partilhados entre todas as instâncias.
    • b) Não há diferença; ambos são tratados da mesma forma.
    • c) Os atributos de classe são específicos para cada objecto, enquanto os atributos de instância são partilhados entre todas as instâncias.
  2. Como se acede a um atributo de classe?

    • a) A partir de uma instância da classe.
    • b) Directamente pela classe.
    • c) Ambas as opções acima.
  3. O que acontece quando alteramos um atributo de classe?

    • a) Apenas a instância onde a alteração foi feita é afectada.
    • b) Todas as instâncias da classe reflectem a alteração.
    • c) A alteração não tem efeito em nenhuma instância.
<< Trabalhando com Atributos Índice Métodos de Acesso (Getter... >>