Anulación de métodos en Python

Requisito previo: Herencia en Python

La anulación de métodos es una capacidad de cualquier lenguaje de programación orientado a objetos que permite que una subclase o clase secundaria proporcione una implementación específica de un método que ya proporciona una de sus superclases o clases principales. Cuando un método en una subclase tiene el mismo nombre, los mismos parámetros o firma y el mismo tipo de retorno (o subtipo) que un método en su superclase, entonces se dice que el método en la subclase anula el método en la superclase. clase.

overriding-in-python

La versión de un método que se ejecuta estará determinada por el objeto que se utiliza para invocarlo. Si se usa un objeto de una clase principal para invocar el método, se ejecutará la versión de la clase principal, pero si se usa un objeto de la subclase para invocar el método, se ejecutará la versión de la clase secundaria. En otras palabras, es el tipo de objeto al que se hace referencia (no el tipo de la variable de referencia) lo que determina qué versión de un método anulado se ejecutará.

Ejemplo:

# Python program to demonstrate 
# method overriding
  
  
# Defining parent class
class Parent():
      
    # Constructor
    def __init__(self):
        self.value = "Inside Parent"
          
    # Parent's show method
    def show(self):
        print(self.value)
          
# Defining child class
class Child(Parent):
      
    # Constructor
    def __init__(self):
        self.value = "Inside Child"
          
    # Child's show method
    def show(self):
        print(self.value)
          
          
# Driver's code
obj1 = Parent()
obj2 = Child()
  
obj1.show()
obj2.show()

Producción:

Inside Parent
Inside Child

Anulación de métodos con herencia múltiple y multinivel

  1. Herencia múltiple: cuando una clase se deriva de más de una clase base, se denomina herencia múltiple .

    Ejemplo: Consideremos un ejemplo en el que queremos anular un método de una sola clase principal. A continuación se muestra la implementación.

    # Python program to demonstrate
    # overriding in multiple inheritance
      
      
    # Defining parent class 1
    class Parent1():
              
        # Parent's show method
        def show(self):
            print("Inside Parent1")
              
    # Defining Parent class 2
    class Parent2():
              
        # Parent's show method
        def display(self):
            print("Inside Parent2")
              
              
    # Defining child class
    class Child(Parent1, Parent2):
              
        # Child's show method
        def show(self):
            print("Inside Child")
         
            
    # Driver's code
    obj = Child()
      
    obj.show()
    obj.display()

    Producción:

    Inside Child
    Inside Parent2
    
  2. Herencia Multinivel: Cuando tenemos una relación de hijo y nieto.

    Ejemplo: Consideremos un ejemplo en el que queremos anular solo un método de una de sus clases principales. A continuación se muestra la implementación.

    # Python program to demonstrate
    # overriding in multilevel inheritance 
      
      
    # Python program to demonstrate
    # overriding in multilevel inheritance 
      
      
    class Parent(): 
            
        # Parent's show method
        def display(self):
            print("Inside Parent")
        
        
    # Inherited or Sub class (Note Parent in bracket) 
    class Child(Parent): 
            
        # Child's show method
        def show(self):
            print("Inside Child")
        
    # Inherited or Sub class (Note Child in bracket) 
    class GrandChild(Child): 
              
        # Child's show method
        def show(self):
            print("Inside GrandChild")         
        
    # Driver code 
    g = GrandChild()   
    g.show()
    g.display()

    Producción:

    Inside GrandChild
    Inside Parent
    

Llamar al método principal dentro del método anulado

Los métodos de la clase principal también se pueden llamar dentro de los métodos anulados. Esto generalmente se puede lograr de dos maneras.

  • Uso de Classname: los métodos de clase de los padres se pueden llamar usando el padre classname.methoddentro del método anulado.

    Ejemplo:

    # Python program to demonstrate
    # calling the parent's class method
    # inside the overridden method
      
      
    class Parent():
          
        def show(self):
            print("Inside Parent")
              
    class Child(Parent):
          
        def show(self):
              
            # Calling the parent's class
            # method
            Parent.show(self)
            print("Inside Child")
              
    # Driver's code
    obj = Child()
    obj.show()

    Producción:

    Inside Parent
    Inside Child
    
  • Usando Super(): la función de Python super()nos brinda la posibilidad de referirnos a la clase principal explícitamente. Es básicamente útil cuando tenemos que llamar funciones de superclase. Devuelve el objeto proxy que nos permite referirnos a la clase principal por ‘super’.

    Ejemplo 1:

    # Python program to demonstrate
    # calling the parent's class method
    # inside the overridden method using
    # super()
      
      
    class Parent():
          
        def show(self):
            print("Inside Parent")
              
    class Child(Parent):
          
        def show(self):
              
            # Calling the parent's class
            # method
            super().show()
            print("Inside Child")
              
    # Driver's code
    obj = Child()
    obj.show()

    Producción:

    Inside Parent
    Inside Child
    

    Ejemplo 2:

    # Program to define the use of super() 
    # function in multiple inheritance 
    class GFG1: 
        def __init__(self): 
            print('HEY !!!!!! GfG I am initialised(Class GEG1)'
        
        def sub_GFG(self, b): 
            print('Printing from class GFG1:', b) 
        
    # class GFG2 inherits the GFG1 
    class GFG2(GFG1): 
        def __init__(self): 
            print('HEY !!!!!! GfG I am initialised(Class GEG2)'
            super().__init__() 
        
        def sub_GFG(self, b): 
            print('Printing from class GFG2:', b) 
            super().sub_GFG(b + 1
        
    # class GFG3 inherits the GFG1 ang GFG2 both 
    class GFG3(GFG2): 
        def __init__(self): 
            print('HEY !!!!!! GfG I am initialised(Class GEG3)'
            super().__init__() 
        
        def sub_GFG(self, b): 
            print('Printing from class GFG3:', b) 
            super().sub_GFG(b + 1
        
        
    # main function 
    if __name__ == '__main__'
        
        # created the object gfg 
        gfg = GFG3() 
        
        # calling the function sub_GFG3() from class GHG3 
        # which inherits both GFG1 and GFG2 classes 
        gfg.sub_GFG(10)

    Producción:

    HEY !!!!!! GfG I am initialised(Class GEG3)
    HEY !!!!!! GfG I am initialised(Class GEG2)
    HEY !!!!!! GfG I am initialised(Class GEG1)
    Printing from class GFG3: 10
    Printing from class GFG2: 11
    Printing from class GFG1: 12
    

Publicación traducida automáticamente

Artículo escrito por nikhilaggarwal3 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 *