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 aquel de quien hereda se llama clase base (o padre).


Sintaxis de herencia de Python

class BaseClass:
  Body of base class
class DerivedClass(BaseClass):
  Body of derived class

La clase derivada hereda características de la clase base donde se le 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 de 3 o más lados. Digamos que tenemos una clase llamada Polygon definido 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 norte y la magnitud de cada lado como una lista llamada lados.

los inputSides() método toma en 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 Triángulo que hereda de Polígono. Esto hace que todos los atributos de Polígono clase disponible para el Triángulo clase.

No necesitamos definirlos de nuevo (reutilización de código). 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, clase Triangle tiene un nuevo método findArea() para encontrar e imprimir el área del triángulo. Aquí hay una ejecución de muestra.

>>> 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 clase Triangle por separado, pudimos usarlos.

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


Anulación de métodos en Python

En el ejemplo anterior, observe que __init__() se definió el método en ambas clases, Triángulo también Polígono. Cuando esto sucede, el método de la clase derivada anula el de la clase base. Esto es para decir, __init__() en Triángulo obtiene preferencia sobre el __init__ en Polígono.

Generalmente, cuando reemplazamos 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__() de __init__() en Triangle).

Una mejor opción sería usar la función incorporada super(). Asi que, super().__init__(3) es equivalente a Polygon.__init__(self,3) y se prefiere. Para aprender más sobre el super() en Python, visite la función Python super().

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

La función isinstance() devoluciones True si 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

Similarmente, issubclass() se utiliza para comprobar la herencia de clase.

>>> issubclass(Polygon,Triangle)
False

>>> issubclass(Triangle,Polygon)
True

>>> issubclass(bool,int)
True

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *