La herencia es útil, pero puedes desbloquear todo su potencial reutilizando el código de las clases base.
Conclusiones clave
- La función super() de Python le permite llamar a métodos de superclase desde una subclase, lo que facilita la implementación de la herencia y la anulación de métodos.
- La función super() está estrechamente relacionada con el Orden de resolución de métodos (MRO) en Python, que determina el orden en el que se buscan métodos o atributos en las clases antecesoras.
- Usar super() en constructores de clases es una práctica común para inicializar atributos comunes en la clase principal y otros más específicos en la clase secundaria. No utilizar super() puede tener consecuencias no deseadas, como la falta de inicializaciones de atributos.
Una de las características principales de Python es su paradigma OOP, que puede utilizar para modelar entidades del mundo real y sus relaciones.
Cuando trabaje con clases de Python, a menudo utilizará la herencia y anulará los atributos o métodos de una superclase. Python proporciona una
súper() función que le permite llamar a los métodos de la superclase desde la subclase.¿Qué es super() y por qué lo necesita?
Usando la herencia, puede crear una nueva clase de Python que herede las características de una clase existente. También puede anular métodos de la superclase en la subclase, proporcionando implementaciones alternativas. Sin embargo, es posible que desee utilizar la nueva funcionalidad además de la anterior, en lugar de sustituirla. En este caso, súper() es útil.
Puedes usar el súper() función para acceder a los atributos de la superclase e invocar métodos de la superclase. Súper es esencial para programación orientada a objetos porque facilita la implementación de la herencia y la anulación de métodos.
¿Cómo funciona super()?
Internamente, súper() está estrechamente relacionado con el Orden de resolución del método (MRO) en Python, que determina el algoritmo de linealización C3.
Así es cómo súper() obras:
- Determinar la clase y la instancia actuales.: Cuando usted llama súper() dentro de un método de una subclase, Python automáticamente descubre la clase actual (la clase que contiene el método que llamó súper()) y la instancia de esa clase (es decir, ser).
- Determinar la superclase: súper() toma dos argumentos (la clase actual y la instancia) que no es necesario pasar explícitamente. Utiliza esta información para determinar la superclase para delegar la llamada al método. Lo hace examinando la jerarquía de clases y el MRO.
- Invocar el método en la Superclase: Una vez determinada la superclase, súper() le permite llamar a sus métodos como si los estuviera llamando directamente desde la subclase. Esto le permite ampliar o anular métodos mientras sigue utilizando la implementación original de la superclase.
Usando super() en un constructor de clases
Usando súper() en un constructor de clases es una práctica común, ya que a menudo querrás inicializar atributos comunes en la clase principal y otros más específicos en la clase secundaria.
Para demostrar esto, definir una clase de Python, Padre, que un Hijo la clase hereda de:
classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_nameclassSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)self.age = age
self.hobby = hobbydefget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")
# Access attributes
print(son.get_info())
Dentro de Hijo constructor, la llamada a super().init() invoca el Padre constructor de clase, pasándolo nombre de pila y apellido como parámetros. Esto asegura que el Padre La clase aún puede configurar los atributos de nombre correctamente, incluso en un Hijo objeto.
si no llamas súper() en un constructor de clase, el constructor de su clase padre no se ejecutará. Esto puede tener consecuencias no deseadas, como inicializaciones de atributos faltantes o configuración incompleta del estado de la clase principal:
...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...
Si ahora intentas llamar al conseguir información método, generará un Error de atributo porque el yo.primer_nombre y yo.apellido Los atributos no se han inicializado.
Usando super() en métodos de clase
Puedes usar súper() en otros métodos, además de los constructores, de la misma manera. Esto le permite ampliar o anular el comportamiento del método de la superclase.
classFather:
defspeak(self):
return"Hello from Father"classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"# Create an instance of the Son class
son = Son()# Call the speak method of the Son class
son_greeting = son.speak()
print(son_greeting)
El Hijo la clase hereda de la Padre y tiene su hablar método. El hablar método de la Hijo usos de clase super().hablar() para llamar al hablar método de la Padre clase. Esto le permite incluir el mensaje de la clase principal mientras lo extiende con un mensaje específico de la clase secundaria.
No utilizar súper() en un método que anula otro significa que la funcionalidad presente en el método de la clase principal no tendrá efecto. Esto da como resultado un reemplazo completo del comportamiento del método, lo que puede llevar a un comportamiento no deseado.
Comprender el orden de resolución del método
El orden de resolución del método (MRO) es el orden en el que Python busca clases ancestrales cuando accede a un método o atributo. MRO ayuda a Python a determinar qué método llamar cuando existen múltiples jerarquías de herencia.
classNigeria():
defculture(self):
print("Nigeria's culture")
classAfrica():
defculture(self):
print("Africa's culture")
Esto es lo que sucede cuando crea una instancia del Lagos clase y llamar al cultura método:
- Python comienza buscando el cultura método en el Lagos clase misma. Si lo encuentra, llama al método. Si no, se pasa al paso dos.
- Si no encuentra el cultura método en el Lagos clase, Python mira las clases base en el orden en que aparecen en la definición de clase. En este caso, Lagos hereda primero de África y luego de Nigeria. Entonces, Python buscará el cultura método en África primero.
- Si no encuentra el cultura método en el África clase, Python luego buscará en el Nigeria clase. Este comportamiento continúa hasta que llega al final de la jerarquía y arroja un error si no puede encontrar el método en ninguna de las superclases.
El resultado muestra el orden de resolución del método de Lagos, empezando de izquierda a derecha.
Errores comunes y mejores prácticas
Al trabajar con súper(), existen algunos errores comunes que se deben evitar.
- Tenga en cuenta el orden de resolución del método, especialmente en escenarios de herencia múltiple. Si necesita utilizar herencia múltiple compleja, debe estar familiarizado con el Algoritmo de linealización C3 que Python usa para determinar MRO.
- Evite las dependencias circulares en su jerarquía de clases, que pueden provocar un comportamiento impredecible.
- Documente su código claramente, especialmente cuando se utiliza súper() en jerarquías de clases complejas, para hacerlo más comprensible para otros desarrolladores.
Utilice super() de la forma correcta
pitón súper() La función es una característica poderosa cuando se trabaja con herencia y anulación de métodos. Entendiendo cómo súper() funciona y seguir las mejores prácticas le permitirá crear código más fácil de mantener y eficiente en sus proyectos de Python.