Herencia de Python (con ejemplos)

La herencia nos permite definir una clase que toma toda la funcionalidad de una clase principal y nos permite agregar más. En este tutorial, aprenderá a usar la herencia en Python.

Video: Herencia de Python

Herencia en Python

La herencia es una característica poderosa en la programación orientada a objetos.

Se refiere a definir una nueva clase con poca o ninguna modificación a una clase existente. La nueva clase se llama clase derivada (o secundaria) y la clase de la que hereda se llama clase base (o principal) .

Sintaxis de herencia de Python

 class BaseClass: Cuerpo de la clase base class DerivedClass (BaseClass): Cuerpo de la clase derivada

La clase derivada hereda características de la clase base donde se pueden agregar nuevas características. Esto da como resultado la reutilización del código.

Ejemplo de herencia en Python

Para demostrar el uso de la herencia, tomemos un ejemplo.

Un polígono es una figura cerrada con 3 o más lados. Digamos, tenemos una clase llamada Polygondefinida de la siguiente manera.

 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))

Esta clase tiene atributos de datos para almacenar el número de lados ny la magnitud de cada lado como una lista llamada lados.

El inputSides()método toma la magnitud de cada lado y dispSides()muestra las longitudes de estos lados.

Un triángulo es un polígono de 3 lados. Entonces, podemos crear una clase llamada Triangle que hereda de Polygon. Esto hace que todos los atributos de la clase Polygon estén disponibles para la clase Triangle.

No necesitamos definirlos nuevamente (reutilización de código). El triángulo se puede definir de la siguiente manera.

 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)

Sin embargo, la clase Triangletiene un nuevo método findArea()para encontrar e imprimir el área del triángulo. Aquí hay una muestra de ejecución.

 >>> 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 aunque no definimos métodos como inputSides()o dispSides()para la clase por Triangleseparado, pudimos usarlos.

Si un atributo no se encuentra en la propia clase, la búsqueda continúa hasta la clase base. Esto se repite de forma recursiva, si la clase base deriva de otras clases.

Anulación de método en Python

En el ejemplo anterior, observe que el __init__()método se definió en ambas clases, Triángulo y Polígono. Cuando esto sucede, el método de la clase derivada reemplaza al de la clase base. Es decir, __init__()en Triángulo tiene preferencia sobre __init__en Polígono.

Generalmente, cuando se reemplaza un método base, tendemos a extender la definición en lugar de simplemente reemplazarla. Lo mismo se hace llamando al método en la clase base desde el de la clase derivada (llamando Polygon.__init__()desde __init__()dentro Triangle).

Una mejor opción sería utilizar la función incorporada super(). Por lo tanto, super().__init__(3)es equivalente Polygon.__init__(self,3)y se prefiere. Para obtener más información sobre la super()función en Python, visite la función Python super ().

Dos funciones integradas isinstance()y issubclass()se utilizan para verificar herencias.

La función isinstance()devuelve Truesi el objeto es una instancia de la clase u otras clases derivadas de ella. Todas y cada una de las clases en Python heredan de la clase base object.

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

De manera similar, issubclass()se usa para verificar la herencia de clases.

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

Articulos interesantes...