Herencia y Composición en Python

Requisito previo: clases y objetos en Python

Este artículo comparará y resaltará las características de la relación is-a y has-a en Python.

¿Qué es la herencia (relación Is-A)? 

Es un concepto de Programación Orientada a Objetos . La herencia es un mecanismo que nos permite heredar todas las propiedades de otra clase. La clase de la que se utilizan las propiedades y funcionalidades se denomina clase principal ( también denominada Clase base) . La clase que utiliza las propiedades de otra clase se denomina clase secundaria ( también conocida como clase derivada) . La herencia también se denomina relación Is-A

Herencia – representación esquemática

En la figura anterior, las clases se representan como cajas. La relación de herencia está representada por una flecha que apunta desde Derived Class(Child Class) a Base Class(Parent Class) . La palabra clave extends indica que la clase secundaria se hereda o se deriva de la clase principal

Sintaxis:   

# Parent class
class Parent :        
           # Constructor
           # Variables of Parent class

           # Methods
           ...

           ...


# Child class inheriting Parent class 
class Child(Parent) :  
           # constructor of child class
           # variables of child class
           # methods of child class

           ...

           ... 

Ejemplo : 

Python3

# parent class
class Parent:
  
    # parent class method
    def m1(self):
        print('Parent Class Method called...')
  
# child class inheriting parent class
class Child(Parent):
  
    # child class constructor
    def __init__(self):
        print('Child Class object created...')
  
    # child class method
    def m2(self):
        print('Child Class Method called...')
  
  
# creating object of child class
obj = Child()
  
# calling parent class m1() method
obj.m1()
  
# calling child class m2() method
obj.m2()
Producción

Child Class object created...
Parent Class Method called...
Child Class Method called...

¿Qué es la composición (relación Has-A)? 

Es uno de los conceptos fundamentales de la Programación Orientada a Objetos. En este concepto, describiremos una clase que hace referencia a uno o más objetos de otras clases como una variable de instancia. Aquí, usando el nombre de la clase o creando el objeto, podemos acceder a los miembros de una clase dentro de otra clase. Permite crear tipos complejos combinando objetos de diferentes clases. Significa que una clase Compuesto puede contener un objeto de otra clase Componente. Este tipo de relación se conoce como relación Has-A .

composición – representación esquemática

 En la figura anterior, las clases se representan como cuadros con el nombre de clase Compuesto y Componente que representa la relación Tiene-A entre ambos.   

class A :

      # variables of class A
      # methods of class A
      ...
      ...

class B : 
      # by using "obj" we can access member's of class A.
      obj = A()

      # variables of class B
      # methods of class B
      
      ...
      ...

Ejemplo : 

Python3

class Component:
  
   # composite class constructor
    def __init__(self):
        print('Component class object created...')
  
    # composite class instance method
    def m1(self):
        print('Component class m1() method executed...')
  
  
class Composite:
  
    # composite class constructor
    def __init__(self):
  
        # creating object of component class
        self.obj1 = Component()
          
        print('Composite class object also created...')
  
     # composite class instance method
    def m2(self):
        
        print('Composite class m2() method executed...')
  
        # calling m1() method of component class
        self.obj1.m1()
  
  
# creating object of composite class
obj2 = Composite()
  
# calling m2() method of composite class
obj2.m2()
Producción

Component class object created...
Composite class object also created...
Composite class m2() method executed...
Component class m1() method executed...

Explicación:

  • En el ejemplo anterior, creamos dos clases Compuesto y Componente para mostrar la relación Tiene-A entre ellos.
  • En la clase Component , tenemos un constructor y un método de instancia m1() .
  • De manera similar, en la clase compuesta , tenemos un constructor en el que creamos un objeto de clase componente. Cada vez que creamos un objeto de Clase compuesta , automáticamente se crea el objeto de la clase Componente .
  • Ahora, en el método m2() de la clase compuesta, estamos llamando al método m1() de la clase de componente utilizando la variable de instancia obj1 en la que se almacena la referencia de la clase de componente .
  • Ahora, siempre que llamemos al método m2() de la clase compuesta, automáticamente se llamará al método m1() de la clase componente .

Composición vs Herencia  

 Es muy confuso entre la mayoría de las personas que ambos conceptos apuntan a la reutilización de código, entonces, ¿cuál es la diferencia entre herencia y composición y cuándo usar herencia y cuándo usar composición? 

La herencia se usa cuando una clase quiere derivar la naturaleza de la clase principal y luego modificar o ampliar la funcionalidad de la misma. La herencia ampliará la funcionalidad con características adicionales que permiten anular los métodos , pero en el caso de Composición , solo podemos usar esa clase, no podemos modificar ni ampliar la funcionalidad de la misma. No proporcionará funciones adicionales. Por lo tanto, cuando se necesita usar la clase tal cual sin ninguna modificación, se recomienda la composición y cuando se necesita cambiar el comportamiento del método en otra clase, se recomienda la herencia.

Publicación traducida automáticamente

Artículo escrito por ronilpatil y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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