es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python: ¿Cómo decoras métodos en clases hijas usando un método en la clase padre?

class Parent:
    # algo aquí que indique que la función "foo" siempre comienza con print("bar")

class Son(Parent):
    def foo(self):
        pass

class Daughter(Parent):
    def foo(self):
        print("q")


Son().foo() # imprime "bar"
Daughter().foo() # imprime "bar" y luego "q"

Intenté usar @super.func, aunque es poco elegante copiar y pegar eso en cada clase que tiene a Parent como padre y tiene el método foo. ¿Hay alguna solución más elegante?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar una función decoradora para modificar el comportamiento del método foo en todas las clases hijas sin tener que copiar y pegar código. Aquí tienes un ejemplo usando un decorador:

    def bar_decorator(foo_func):
        def wrapped_func(*args, **kwargs):
            print("bar")
            return foo_func(*args, **kwargs)
        return wrapped_func
    
    class Parent:
        @bar_decorator
        def foo(self):
            pass
    
    class Son(Parent):
        pass
    
    class Daughter(Parent):
        def foo(self):
            super().foo()
            print("q")
    
    Son().foo() # imprime "bar"
    Daughter().foo() # imprime "bar" y luego "q"
    

    En este ejemplo, la función bar_decorator toma una función como argumento, la envuelve con funcionalidad adicional (en este caso, imprimir “bar”) y luego devuelve la función envuelta. El decorador @bar_decorator se aplica al método foo de la clase Parent, por lo que cada vez que una clase hija llama a foo, se ejecutará la función envuelta. Esto nos permite agregar comportamiento al método foo de Parent sin modificar directamente ninguna clase hija. Por último, la clase Daughter demuestra cómo podemos usar super() para llamar al método foo original antes de agregar nuestra propia funcionalidad.

Comments are closed.