• Conceitos de P.O.O

Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Como utilizar herança de classe
  2. Construtores e herança
  3. Acessando recursos da classe pai
  4. Sobrescrita de método
  5. Identificar tipo de classe com issubclass
  6. Herança múltipla

Os assuntos sobre herança de interface e herança múltipla serão abordados em POO: Classe Abstrata e Interface, pois é necessário o conhecimentos básico sobre uso de interfaces em Python.

Outro conceito de O.O que vamos aplicar na linguagem Python, é o conceito de herança que pode ser resumido a um relacionamento é-um em que uma classe herda características de uma classe pai podendo utilizar os recursos dessa classe e também estendê-la.

A sintaxe para a utilização de herança entre classes é feita da utilizando o nome da classe que desejamos herdar informada dentro de () como mostrado abaixo:

Sintaxe
class nome_classe_pai:
    #atributos
    #métodos

class nome_classe_filha(nome_classe_pai) #herança
    #atributos
    #métodos
Onde
-

Não há diferença na instanciação de um objeto utilizando uma classe que usa o conceito de herança. Os termos Pai e Filha acima serão utilizados ao longo deste tutorial para facilitar a compreensão.

Exemplo 1
class pai:
    x = 1
    #métodos omitidos
class filha(pai):
    y = 2
    #métodos omitidos
Saída
-

Em Python, o construtor padrão, sem parâmetros não é invocado automaticamente quando instanciamos um objeto da classe filha.

Exemplo 2
class pai:
    def __init__(self):
        print("__init__ pai")

class filha(pai):
    def __init__(self):
        print("__init__ filha")

ob2 = filha()
Saída
__init__ filha

A chamada ao construtor da classe pai deve ser feita implícitamente como mostrado na sintaxe abaixo:

Sintaxe
class nome_classe_filha:
    def __init__(self,parametros)
        nome_classe_pai.__init__(self,parametros)
        #corpo
Exemplo 3
class pai:
    param = 0
    def __init__(self,param):
        self.param = param
        print("__init__ pai")

class filha(pai):
    def __init__(self,param):
        pai.__init__(self,param)
        print("__init__ filha")

obj = filha("Teste")
print(obj.param)
Saída
__init__ pai
__init__ filha
Teste

Como estamos utilizando herança, uma classe filha tem acesso aos recursos public e protected da classe pai. Para acesso a esses recursos, utilizamos o nome da classe pai herdade.

Sintaxe
classe_pai.nome_atributo
classe_pai.nome_metodo(argumentos)
Exemplo 4
class pai:
    param = 999

    def metodo_pai():
        print("metodo_pai")

class filha(pai):
    def metodo_filha():
        print(pai.param)
        pai.metodo_pai()

obj = filha
obj.metodo_filha()
Saída
999

Outro conceito O.O que vamos aplicar na linguagem Python, é o conceito de sobrescrita que consiste em um classe Filha alterar a implementação de um método herdado da classe Pai. Dessa forma, uma classe Filha pode utilizar uma mesma assinatura de método com comportamento diferente.

Exemplo 5
class pai:
    
    def metodo(self,p): #método para sobrescrever
        print("%d" % p) #decimal

class filha(pai):
    
    def metodo(self,q): #método sobrescrito
        print("%x" % q) #hexa

obj = pai()
obj.metodo(10)
obj = filha()
obj.metodo(10)
Saída
10
a

Por padrão, qualquer método public, protected e private podem sofrer sobreescrita quando sua classe for herdada. A linguagem Python não possui recurso para prevenir a sobrescrita.

  1. 19/09/2024 - revisão 2 - Correções em descrição de tópicos; ajustes gramaticais; outros ajustes
  2. 30/08/2024 - revisão 1 - Correção em link de Construtor e Herança
  3. 20/02/2024 - versão inicial