Herança, Polimorfismo e o super() do Python

Quando trabalhamos com Orientação a Objetos com Python, muitos tem dúvidas sobre a real função e utilização do super(). Tentarei através desse post explicar e exemplificar o uso da mesma, tendo como base minhas experiências com a técnica no dia a dia.

O super() é utilizado entre heranças de classes, ele nos proporciona extender/subscrever métodos de uma super classe (classe pai) para uma sub classe (classe filha), atrávez dele definimos um novo comportamento para um determinado método construido na classe pai e herdado pela classe filha.

Para entender melhor, considere o código abaixo como exemplo:

#Python 2

class Pai(object):
 def __init__(self):
print('Construindo a classe Pai')
class Filha(Pai):
 def __init__(self):
super(Filha, self).__init__()

#Python 3

class Pai(object):
  def __init__(self):
print('Construindo a classe Pai')
class Filha(Pai):
  def __init__(self):
super().__init__()

No exemplo acima, temos uma sub classe que herda da super classe e utiliza o super() para chamar o método construtor da classe Pai em seu próprio método construtor. Isso nos proporciona uma melhor manutenabilidade do código, tendo em vista que se usássemos de forma direta como no exemplo abaixo:

class Pai(object):
 def __init__(self):
print('Construindo a classe Pai')
class Filha(Pai):
 def __init__(self):
Pai.__init__(self)

Teriamos um acesso ao método construtor da classe Pai de uma forma amarrada, onde se caso precisássemos modificar a classe herdada, teriamos mais trabalho tendo que modificar em vários outros lugares a mesma, como exemplificado abaixo:

class Pai(object):
 def __init__(self):
print('Construindo a classe Pai')
class Mae(object):
 def __init__(self):
print('Construindo a classe Mae')
class Filha(Mae):
 def __init__(self):
Pai.__init__(self)

Percebeu? Usando o super() não teriamos tal problema:

class Pai(object):
 def __init__(self):
print('Construindo a classe Pai')
class Mae(object):
 def __init__(self):
print('Construindo a classe Mae')
class Filha(Mae):
 def __init__(self):
super().__init__()

O código acima executa o método construtor independente da super classe que a sub classe esteja herdando.

Quando precisamos extender métodos da super classe na sub classe, também podemos usar o super() a nosso favor. Imagine que precisamos passar novos parâmetros para um método já existente, poderiamos fazer dessa forma:

class Pai(object):
 def __init__(self, peso, altura):
self.peso = peso
self.altura = altura
class Filha(Pai):
 def __init__(self, peso, altura, cabelo):
super().__init__(peso, altura)
self.cabelo = cabelo

Conclusão

Conforme visto aqui, o super() é algo essencial no dia a dia de um programador python, proporcionando de forma simples e objetiva subscrever/extender métodos a nosso favor.

Show your support

Clapping shows how much you appreciated Hudson Brendon’s story.