Atributos e Métodos

Os atributos e os métodos são componentes fundamentais das classes em Programação Orientada a Objetos (POO). Eles são essenciais para criar e manipularem os objetos das nossas classes. Vamos entender cada um deles com exemplos práticos em Python.

Atributos

O que são Atributos?

Atributos são variáveis associadas a uma classe e a seus objetos. Eles representam as características e o estado de um objeto. Existem dois tipos principais de atributos:

  1. Atributos de instância: Pertencem a uma instância específica da classe.
  2. Atributos de classe: Pertencem à própria classe, compartilhados entre todas as instâncias.

Definição de Atributos de Instância

Para definir atributos de instância, utilizamos o método __init__, que é o construtor da classe.

class Cao:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

# Criando um objeto da classe Cao
meu_cao = Cao("Rex", 5)
print(meu_cao.nome)  # Output: Rex
print(meu_cao.idade) # Output: 5

Definição de Atributos de Classe

Atributos de classe são definidos diretamente na classe e não dentro de métodos.

class Cao:
    especie = "Canis lupus familiaris"
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

# Criando um objeto da classe Cao
meu_cao = Cao("Rex", 5)
print(Cao.especie)   # Output: Canis lupus familiaris
print(meu_cao.especie) # Output: Canis lupus familiaris

Métodos

O que são Métodos?

Métodos são funções definidas dentro de uma classe, projetadas para realizar operações usando os atributos dos objetos. Existem diferentes tipos de métodos, mas vamos focar nos métodos de instância e de classe.

Definição de Métodos de Instância

Métodos de instância operam em instâncias individuais da classe e podem aceder e modificar o estado do objeto.

class Cao:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade
    def latir(self):
        return "Au Au!"

# Criando um objeto da classe Cao
meu_cao = Cao("Rex", 5)
print(meu_cao.latir()) # Output: Au Au!

Definição de Métodos de Classe

Métodos de classe operam na classe como um todo, e não em instâncias individuais. Para definir um método de classe, utilizamos o decorador @classmethod.

class Cao:
    especie = "Canis lupus familiaris"
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    @classmethod
    def info_especie(cls):
        return cls.especie

# Chamando um método de classe
print(Cao.info_especie()) # Output: Canis lupus familiaris

Exemplos Práticos

Exemplo 1: Sistema de Biblioteca

Vamos criar uma classe Livro que tenha atributos como titulo, autor e ano. Também implementaremos métodos para mostrar as informações do livro.

class Livro:
    def __init__(self, titulo, autor, ano):
        self.titulo = titulo
        self.autor = autor
        self.ano = ano

    def mostrar_info(self):
        return f"'{self.titulo}' por {self.autor}, publicado em {self.ano}"

# Criando um objeto da classe Livro
livro1 = Livro("1984", "George Orwell", 1949)
print(livro1.mostrar_info()) # Output: '1984' por George Orwell, publicado em 1949

Exemplo 2: Conta Bancária

Vamos agora criar uma classe ContaBancaria que tenha atributos como saldo e titular e métodos para depositar e levantar dinheiro.

class ContaBancaria:
    def __init__(self, titular, saldo=0):
        self.titular = titular
        self.saldo = saldo

    def depositar(self, quantia):
        self.saldo += quantia
        return f"Saldo após depósito: {self.saldo} euros"

    def levantar(self, quantia):
        if quantia <= self.saldo:
            self.saldo -= quantia
            return f"Saldo após levantamento: {self.saldo} euros"
        else:
            return "Saldo insuficiente"

# Criando um objeto da classe ContaBancaria
conta = ContaBancaria("Maria", 1000)
print(conta.depositar(500))  # Output: Saldo após depósito: 1500 euros
print(conta.levantar(200))   # Output: Saldo após levantamento: 1300 euros
print(conta.levantar(2000))  # Output: Saldo insuficiente

Resumo

Os atributos e os métodos são peças-chave na definição de classes em POO. Atributos podem ser de instância ou de classe, enquanto métodos permitem manipular esses atributos para realizar diversas operações. Compreender estes conceitos é fundamental para progredir no desenvolvimento de aplicações utilizando POO.

Questionário

  1. Qual é a principal diferença entre atributos de instância e atributos de classe?
  2. Como se define um método de classe em Python?
  3. Dê um exemplo de como uma classe pode ter um método que altera um atributo de instância.
  4. O que acontece se tentarmos aceder a um atributo de instância antes de inicializá-lo com o método __init__?
  5. Como podemos garantir que um método de instância pode modificar o estado de diferentes objetos da mesma classe?

Este questionário serve para verificar a sua compreensão dos conceitos de atributos e métodos em POO com Python. Boa sorte!

<< Classes e Objetos Índice Encapsulamento, Herança e... >>