Python super() – Python 3 super()

La función super() de Python nos permite referirnos explícitamente a la clase padre. Es útil en caso de herencia donde queremos llamar a funciones de la clase padre.

Python super

Para entender la función super de Python, debes conocer acerca de la herencia en Python. En la herencia en Python, las subclases heredan de la superclase. La función super() de Python nos permite referirnos a la superclase de forma implícita. Así, la función super de Python facilita y hace más cómoda nuestra tarea. Al referirnos a la superclase desde la subclase, no necesitamos escribir el nombre de la superclase explícitamente. En las siguientes secciones, discutiremos la función super de Python.

Ejemplo de la función super de Python

Primero, observa el siguiente código que usamos en nuestro tutorial sobre herencia en Python. En ese ejemplo de código, la superclase era Person y la subclase era Student. Entonces, el código se muestra a continuación.

class Person:
    # inicializando las variables
    name = ""
    age = 0

    # definiendo el constructor
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # definiendo los métodos de clase

    def show_name(self):
        print(self.name)

    def show_age(self):
        print(self.age)


# comienza la definición de la subclase
class Student(Person):
    studentId = ""

    def __init__(self, student_name, student_age, student_id):
        Person.__init__(self, student_name, student_age)
        self.studentId = student_id

    def get_id(self):
        return self.studentId  # returns the value of student id


# fin de la definición de la subclase


# Crea un objeto de la superclase
person1 = Person("Richard", 23)
# llama a los métodos miembros de los objetos
person1.show_age()
# Crea un objeto de la subclase
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

En el ejemplo anterior, hemos llamado a la función de la clase padre como:

Person.__init__(self, student_name, student_age) 

Podemos reemplazar esto con la llamada de función super de Python como se muestra a continuación.

super().__init__(student_name, student_age)

La salida seguirá siendo la misma en ambos casos, como se muestra en la siguiente imagen.

Super de Python 3

Tenga en cuenta que la sintaxis anterior es para la función super de Python 3. Si está utilizando versiones de Python 2.x, entonces es ligeramente diferente y deberá realizar los siguientes cambios:

class Person(object):
...
        super(Student, self).__init__(student_name, student_age)

El primer cambio es tener object como la clase base para Person. Es necesario usar la función super en las versiones de Python 2.x. De lo contrario, obtendrá el siguiente error.

Traceback (most recent call last):
  File "super_example.py", line 40, in <module>
    student1 = Student("Max", 22, "102")
  File "super_example.py", line 25, in __init__
    super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

El segundo cambio está en la sintaxis de la función super en sí misma. Como puede ver, la función super de Python 3 es mucho más fácil de usar y la sintaxis también es más limpia.

Función super de Python con herencia multinivel

Como hemos mencionado anteriormente, la función super() de Python nos permite referirnos a la superclase implícitamente. Pero en el caso de herencias multinivel, ¿a qué clase se referirá? Bueno, la función super() de Python siempre se referirá a la superclase inmediata. Además, la función super() de Python no solo puede referirse a la función __init__() sino que también puede llamar a todas las demás funciones de la superclase. Así que, en el siguiente ejemplo, veremos eso.

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

Vamos a ver la salida del ejemplo de super de Python 3 anterior con herencia multinivel.

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

Por lo tanto, a partir de la salida, podemos ver claramente que la función __init__() de la clase C ha sido llamada primero, luego la clase B y después la clase A. Lo mismo sucedió al llamar a la función sub_method().

¿Por qué necesitamos la función super de Python?

Si tienes experiencia previa en el lenguaje Java, entonces deberías saber que la clase base también se llama mediante un objeto super allí. Por lo tanto, este concepto es realmente útil para los programadores. Sin embargo, Python también mantiene la facilidad para que el programador utilice el nombre de la superclase para referirse a ellas. Y, si tu programa contiene herencia de múltiples niveles, entonces esta función super() te será útil. Así que eso es todo sobre la función super de Python. Esperanzadamente, has entendido este tema. Utiliza el cuadro de comentarios para cualquier consulta.

Puedes revisar el script completo de Python y más ejemplos de Python desde nuestro Repositorio de GitHub.

Referencia: Documentación Oficial

Source:
https://www.digitalocean.com/community/tutorials/python-super