Saltar al contenido

Trabajar con la superfunción de Python

Python 2.2 vio la introducción de una función incorporada llamada “super”, que devuelve un objeto proxy para delegar llamadas a métodos a una clase, que puede ser padre o hermano por naturaleza.

Es posible que esa descripción no tenga sentido a menos que tenga experiencia trabajando con Python, por lo que la desglosaremos.

Esencialmente, la superfunción se puede usar para obtener acceso a métodos heredados, de una clase principal o hermana, que se ha sobrescrito en un objeto de clase.

O como la documentación oficial de Python dice:

“[Super is used to] devuelve un objeto proxy que delega las llamadas a métodos a una clase de tipo padre o hermana. Esto es útil para acceder a métodos heredados que se han anulado en una clase. El orden de búsqueda es el mismo que el utilizado por getattr () excepto que se omite el tipo en sí “.

¿Cómo se usa la superfunción?

La superfunción es algo versátil y se puede utilizar de varias formas.

Caso de uso 1: Se puede llamar a Super en una sola herencia, para hacer referencia a la clase principal o varias clases sin nombrarlas explícitamente. Es algo así como un atajo, pero lo más importante es que ayuda a mantener su código en un futuro previsible.

Caso de uso 2: se puede utilizar Super en un entorno de ejecución dinámica para la herencia múltiple o colaborativa. Este uso se considera exclusivo de Python, porque no es posible con lenguajes que solo admiten herencia única o están compilados estáticamente.

Cuando se introdujo la superfunción, generó un poco de controversia. Muchos desarrolladores encontraron que la documentación no estaba clara y que la función en sí era complicada de implementar. Incluso se ganó la reputación de ser dañino. Pero es importante recordar que Python ha evolucionado considerablemente desde 2.2 y muchas de estas preocupaciones ya no se aplican.

Lo mejor de super es que se puede utilizar para mejorar cualquier método de módulo. Además, no es necesario conocer los detalles sobre la clase base que se utiliza como extensor. La superfunción se encarga de todo por ti.

Entonces, para todos los efectos, super es un atajo para acceder a una clase base sin tener que saber su tipo o nombre.

En Python 3 y superior, la sintaxis de super es:

super().methoName(args)

Mientras que la forma normal de llamar a super (en versiones anteriores de Python) es:

super(subClass, instance).method(args)

Como puede ver, la versión más reciente de Python simplifica un poco la sintaxis.

¿Cómo llamar a Super en Python 2 y Python 3?

Primero, tomaremos una definición de clase regular y la modificaremos agregando la superfunción. El código inicial se verá así:

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.

class MyParentClass(object):
def __init__(self):
pass

class SubClass(MyParentClass):
def __init__(self):
MyParentClass.__init__(self)

Como puede ver, esta es una configuración que se usa comúnmente para herencia única. Podemos ver que hay una clase base o principal (también llamada a veces superclase) y una subclase denotada.

Pero aún necesitamos inicializar la clase padre dentro de la subclase. Para facilitar este proceso, el equipo de desarrollo central de Python creó la superfunción. El objetivo era proporcionar una solución mucho más abstracta y portátil para inicializar clases.

Si estuviéramos usando Python 2, escribiríamos la subclase así (usando la superfunción):

class SubClass(MyParentClass):
def __init__(self):
super(SubClass, self).__init__()

Sin embargo, el mismo código es ligeramente diferente cuando se escribe en Python 3.

class MyParentClass():
def __init__(self):
pass

class SubClass(MyParentClass):
def __init__(self):
super()

¿Observa cómo la clase principal ya no se basa directamente en la clase base del objeto? Además, gracias a la superfunción no necesitamos pasarle nada de la clase padre. ¿No estás de acuerdo con que esto es mucho más fácil?

Ahora, tenga en cuenta que a la mayoría de las clases también se les pasarán argumentos. La superfunción cambiará aún más cuando eso suceda.

Se verá así:

class MyParentClass():
def __init__(self, x, y):
pass

class SubClass(MyParentClass):
def __init__(self, x, y):
super().__init__(x, y)

Nuevamente, este proceso es mucho más sencillo que el método tradicional. En este caso, tuvimos que llamar al método __init__ de la superfunción para pasar nuestros argumentos.

¿Para qué sirve la superfunción de nuevo?

La superfunción es extremadamente útil cuando le preocupa la compatibilidad con versiones posteriores. Al agregarlo a su código, puede asegurarse de que su trabajo permanecerá operativo en el futuro con solo unos pocos cambios en todos los ámbitos.

En última instancia, elimina la necesidad de declarar ciertas características de una clase, siempre que la use correctamente.

Para utilizar la función correctamente, se deben cumplir las siguientes condiciones:

  • El método al que recurre súper() debe existir
  • Tanto las funciones de llamador como de destinatario deben tener una firma de argumento coincidente
  • Cada ocurrencia del método debe incluir súper() después de usarlo

Puede comenzar con una sola clase de herencia, pero luego, si decide agregar otra clase base, o más, el proceso es mucho más sencillo. Solo necesita hacer unos pocos cambios en lugar de muchos.

Se ha hablado del uso de la superfunción para la inyección de dependencias, pero no hemos visto ningún ejemplo sólido de esto, al menos no prácticos. Por ahora, solo vamos a ceñirnos a la descripción que hemos dado.

De cualquier manera, ahora comprenderá que super no es tan malo como otros desarrolladores pretenden que sea.

Más información sobre la función Super

Sabemos mucho sobre la superfunción y el lenguaje Python en general, ¡pero no lo sabemos todo! ¡Hay muchos otros lugares a los que puede ir para obtener más información!

Los sitios que recomendamos revisar son:

Documentación oficial de Python

Exploración de Raymond Hettinger de Super y Python

Cómo usarlo de manera súper efectiva – Receta de la versión 2.7 de Python

Aprenda Python de la manera difícil – Ejercicio 44: Herencia versus composición

Orden de resolución del método Python 2.3

Sixty-North: Python’s Super no es tan simple como pensabas

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.