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