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 Polygon
definida 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 Triangle
tem 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 Triangle
separadamente, 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 True
se 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