Python super()

En este tutorial, aprenderemos sobre la función super() de Python con la ayuda de ejemplos.

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

¿Quiere ampliar sus conocimientos de programación en Python? No se pierda nuestra selección de los mejores cursos en línea de Python. ¡Elija el suyo y aproveche las ofertas actuales!

Ejemplo

class Animal(object):
  def __init__(self, animal_type):
    print('Animal Type:', animal_type)
    
class Mammal(Animal):
  def __init__(self):

# call superclass super().__init__('Mammal')
print('Mammals give birth directly') dog = Mammal() # Output: Animal Type: Mammal # Mammals give birth directly

Uso de super()

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

  • 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 la herencia única, usamos para referirnos a la clase base.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

Dog has four legs.
Dog is a warm-blooded animal.

Aquí, llamamos al método de la clase (de la clase) usando código__init__()MammalDog

super().__init__('Dog')

en lugar de

Mammal.__init__(self, 'Dog')

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 builtin devuelve un objeto proxy, un objeto sustituto que puede llamar a métodos de la clase base a través de la delegación. Esto se denomina indirección (capacidad de hacer referencia al objeto base con super()super())

Dado que la indirección se calcula en el tiempo de ejecución, podemos usar 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

Dog has 4 legs.
Dog can't swim.
Dog can't fly.
Dog is a warm-blooded animal.
Dog is an animal.

Bat can't swim.
Bat is a warm-blooded animal.
Bat is an animal.

Orden de resolución de métodos (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 mediante el atributo.__mro__

>>> Dog.__mro__
(<class 'Dog'>, 
<class 'NonMarineMammal'>, 
<class 'NonWingedMammal'>, 
<class 'Mammal'>, 
<class 'Animal'>, 
<class 'object'>)

Así es como funciona MRO:

  • Un método en las llamadas derivadas siempre se
    llama antes del método de la clase base. En nuestro ejemplo, la clase se llama antes o . Estas dos clases se llaman antes , que se llama antes , y la clase se llama antes del .DogNonMarineMammalNoneWingedMammalMammalAnimalAnimalobject
  • Si hay varios padres como , métodos de se invoca primero porque aparece primero.Dog(NonMarineMammal, NonWingedMammal)NonMarineMammal

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

Deja un comentario