Python super ()

El super () incorporado devuelve un objeto proxy (objeto temporal de la superclase) que nos permite acceder a métodos de la clase base.

En Python, super()tiene dos casos de uso principales:

  • Nos permite evitar el uso explícito del nombre de la clase base.
  • Trabajar con herencia múltiple

Ejemplo 1: super () con herencia única

En el caso de herencia única, nos permite hacer referencia a la clase base por super().

 class Mammal(object): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') class Dog(Mammal): def __init__(self): print('Dog has four legs.') super().__init__('Dog') d1 = Dog()

Salida

El perro tiene cuatro patas. El perro es un animal de sangre caliente.

Aquí, llamamos al __init__()método de la clase Mammal (de la clase Dog) usando código

 super () .__ init __ ('Perro')

en vez de

 Mamífero .__ init __ (yo, 'Perro')

Dado que no necesitamos especificar el nombre de la clase base cuando llamamos a sus miembros, podemos cambiar fácilmente el nombre de la clase base (si es necesario).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

El super()incorporado devuelve un objeto proxy, un objeto sustituto que puede llamar a métodos de la clase base mediante delegación. Esto se llama indirección (capacidad para hacer referencia al objeto base con super())

Dado que la indirección se calcula en tiempo de ejecución, podemos utilizar diferentes clases base en diferentes momentos (si es necesario).

Ejemplo 2: super () con herencia múltiple

 class Animal: def __init__(self, Animal): print(Animal, 'is an animal.'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "can't fly.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "can't swim.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Dog has 4 legs.'); super().__init__('Dog') d = Dog() print('') bat = NonMarineMammal('Bat')

Salida

El perro tiene 4 patas. El perro no puede nadar. El perro no puede volar. El perro es un animal de sangre caliente. El perro es un animal. Bat no puede nadar. Bat es un animal de sangre caliente. Bat es un animal.

Orden de resolución de método (MRO)

El orden de resolución de métodos (MRO) es el orden en el que los métodos deben heredarse en presencia de herencia múltiple. Puede ver el MRO utilizando el __mro__atributo.

 >>> Perro .__ mro__ (,,,,,)

Así es como funciona MRO:

  • Un método en las llamadas derivadas siempre se llama antes que el método de la clase base.
    En nuestro ejemplo, la clase Dog se llama antes que NonMarineMammal o NoneWingedMammal. Estas dos clases se llaman antes que Mammal, que se llama antes que Animal, y la clase Animal se llama antes que el objeto.
  • Si hay varios padres como Dog(NonMarineMammal, NonWingedMammal), los métodos de NonMarineMammal se invocan primero porque aparecen primero.

Para obtener más información super(), visite super () de Python considerado super!

Articulos interesantes...