Herança Python (com exemplos)

A herança nos permite definir uma classe que obtém todas as funcionalidades de uma classe pai e nos permite adicionar mais. Neste tutorial, você aprenderá a usar herança em Python.

Vídeo: Herança Python

Herança em Python

Herança é um recurso poderoso na programação orientada a objetos.

Refere-se à definição de uma nova classe com pouca ou nenhuma modificação em uma classe existente. A nova classe é chamada de classe derivada (ou filha) e aquela da qual ela herda é chamada de classe base (ou pai) .

Sintaxe de herança Python

 classe BaseClass: Corpo da classe base DerivedClass (BaseClass): Corpo da classe derivada

A classe derivada herda recursos da classe base onde novos recursos podem ser adicionados a ela. Isso resulta na reutilização do código.

Exemplo de herança em Python

Para demonstrar o uso da herança, vamos dar um exemplo.

Um polígono é uma figura fechada com 3 ou mais lados. Digamos, temos uma classe chamada Polygondefinida como segue.

 class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = (0 for i in range(no_of_sides)) def inputSides(self): self.sides = (float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))

Essa classe possui atributos de dados para armazenar o número de lados ne magnitude de cada lado como uma lista chamada lados.

O inputSides()método considera a magnitude de cada lado e dispSides()exibe esses comprimentos laterais.

Um triângulo é um polígono com 3 lados. Então, podemos criar uma classe chamada Triangle que herda de Polygon. Isso torna todos os atributos da classe Polygon disponíveis para a classe Triangle.

Não precisamos defini-los novamente (capacidade de reutilização do código). O triângulo pode ser definido como segue.

 class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)

No entanto, a classe Triangletem um novo método findArea()para localizar e imprimir a área do triângulo. Aqui está um exemplo de execução.

 >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00

Podemos ver que embora não tenhamos definido métodos como inputSides()ou dispSides()para classe Triangleseparadamente, fomos capazes de usá-los.

Se um atributo não for encontrado na própria classe, a pesquisa continua até a classe base. Isso se repete recursivamente, se a própria classe base for derivada de outras classes.

Substituição de método em Python

No exemplo acima, observe que o __init__()método foi definido em ambas as classes, Triângulo e também Polígono. Quando isso acontece, o método na classe derivada substitui o da classe base. Ou seja, __init__()no Triângulo tem preferência sobre o __init__no Polígono.

Geralmente, ao substituir um método base, tendemos a estender a definição em vez de simplesmente substituí-la. O mesmo está sendo feito chamando o método na classe base daquele na classe derivada (chamando Polygon.__init__()de __init__()em Triangle).

Uma opção melhor seria usar a função embutida super(). Portanto, super().__init__(3)é equivalente a Polygon.__init__(self,3)e é o preferido. Para saber mais sobre a super()função em Python, visite a função Python super ().

Duas funções integradas isinstance()e issubclass()são usadas para verificar heranças.

A função isinstance()retorna Truese o objeto for uma instância da classe ou outras classes derivadas dela. Cada classe em Python herda da classe base object.

 >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

Da mesma forma, issubclass()é usado para verificar a herança de classe.

 >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

Artigos interessantes...