7.1 Método super()
Já que tocamos na hierarquia de herança, é útil falar sobre os detalhes de se trabalhar com campos e métodos da classe base. Para isso, Python tem um método super(). Este método é usado para chamar métodos da classe base dentro da classe filha.
Existem três principais áreas de aplicação:
Chamada de métodos da classe pai:
O método super() permite chamar um método da classe pai a partir da classe filha, sem especificar explicitamente o nome da classe pai. Isso é especialmente útil ao trabalhar com herança múltipla e ajuda a evitar erros ao modificar a hierarquia de classes.
Inicialização de classes base:
super() é frequentemente usado no construtor da classe filha para chamar o construtor da classe base, permitindo inicializar atributos da classe base na classe filha.
Suporte a herança múltipla:
No caso de herança múltipla, super() resolve corretamente a ordem de chamadas de métodos (MRO, Method Resolution Order), tornando seu uso preferível a chamadas explícitas de métodos das classes pai. Falaremos sobre isso um pouco mais à frente.
7.2 Construtor da classe base
O construtor da classe base deve ser chamado explicitamente. Parece que isso acontece automaticamente, mas na verdade não é assim. Construtores de classes base sempre precisam ser chamados explicitamente, já que muitas vezes é necessário passar argumentos especiais.
Exemplo:
class Animal:
def __init__(self, type, name):
self.type = type
self.name = name
class Dog(Animal):
def __init__(self, name):
super().__init__("Cachorro", name) # Chama o construtor da classe base
class Cat(Animal):
def __init__(self, name):
super().__init__("Gato", name) # Chama o construtor da classe base
# Criando um objeto Dog
dog = Dog("Buddy")
print(dog)
Neste exemplo, o construtor da classe base (Animal) tem dois parâmetros: tipo do animal e o nome dele. Já as classes que herdaram têm apenas um — apenas o nome.
É precisamente nos construtores das classes Dog e Cat que se decide o que passar para o construtor da classe base — os nomes dos tipos de animais: “Cachorro” e “Gato”.
Assim:
- O construtor da classe base precisa ser chamado no construtor da classe filha.
- Para isso, precisamos usar o método
super(). - Não é necessário passar o parâmetro
selfseparadamente — Python o adiciona automaticamente ao chamar o método.
7.3 Uso do método super()
O método super() em Python pode ser usado não apenas nos construtores, mas também em outros métodos de classes para chamar métodos da classe pai. Isso pode ser útil quando é necessário estender ou modificar o comportamento de um método definido na classe pai.
Vamos ver alguns exemplos:
Chamando um método da classe pai em um método da filha
Neste exemplo, o método speak() na classe Dog primeiro chama o método speak() da classe Animal usando super(), e então adiciona seu próprio comportamento.
class Animal:
def speak(self):
return "Algum som genérico de animal"
class Dog(Animal):
def speak(self):
parent_speech = super().speak() # Chama o método da classe pai
return f"{parent_speech} E o cachorro late!"
dog = Dog()
print(dog.speak()) # Vai mostrar: Algum som genérico de animal E o cachorro late!
Chamada de método da classe pai para verificar estado
Neste exemplo, o método check_health() na classe Dog chama o método check_health() da classe Animal, para adicionar verificações adicionais.
class Animal:
def check_health(self):
return "Animal está saudável"
class Dog(Animal):
def check_health(self):
parent_check = super().check_health() # Chama o método da classe pai
return f"{parent_check}. O cachorro precisa de uma caminhada!"
dog = Dog()
print(dog.check_health()) # Vai mostrar: Animal está saudável. O cachorro precisa de uma caminhada!
Chamada de método da classe pai em um método que altera estado
Neste exemplo, o método withdraw() na classe SavingsAccount primeiro verifica se o limite de retirada foi excedido, e se não, chama o método withdraw() da classe BankAccount para realizar a operação.
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
return f"Sacou {amount}. Novo saldo: {self.balance}"
return "Fundos insuficientes"
class SavingsAccount(BankAccount):
def withdraw(self, amount):
if amount > 1000:
return "Limite de retirada excedido"
return super().withdraw(amount) # Chama o método da classe pai
savings = SavingsAccount(1500)
print(savings.withdraw(500)) # Vai mostrar: Sacou 500. Novo saldo: 1000
print(savings.withdraw(1500)) # Vai mostrar: Limite de retirada excedido
GO TO FULL VERSION