Herencia de Python
Herencia de Python
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 hija) y la que 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 n y la magnitud de cada lado como una lista llamada lados .
El inputSides()
El 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 Polygon 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, la 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 la 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, Triangle también Polígono . Cuando esto sucede, el método de la clase derivada anula el de la clase base. Es 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 a Polygon.__init__()
de __init__()
en Triangle
).
Una mejor opción sería usar la función integrada super()
. Entonces, super().__init__(3)
es equivalente a Polygon.__init__(self,3)
y se prefiere. Para obtener más información sobre el super()
en Python, visite la función Python super().
Dos funciones integradas isinstance()
y issubclass()
se utilizan para comprobar herencias.
La función isinstance()
devuelve 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
Del mismo modo, issubclass()
se utiliza para verificar la herencia de clases.
>>> issubclass(Polygon,Triangle)
False
>>> issubclass(Triangle,Polygon)
True
>>> issubclass(bool,int)
True
python
- Tipos de datos de Python
- Operadores de Python
- Declaración de paso de Python
- Diccionario de Python
- Excepciones personalizadas de Python
- Programación orientada a objetos de Python
- Sobrecarga del operador de Python
- Python @property decorador
- type() y isinstance() en Python con ejemplos
- C# - Herencia
- Python - Orientado a Objetos