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.

Método de Python para el hijo con menos entrada, mejores prácticas

Tengo dos clases, A y su hijo B. El __init__ de A utiliza same_method(*some_input).
En B, este método debe ajustarse para no recibir ninguna entrada. (Este es un ejemplo simplificado).

class A():
    def __init__(self, *some_input) -> None:
        self.same_method(*some_input)

    def same_method(self, *some_input):
        print(*some_input)


class B(A):
    def __init__(self) -> None:
        super().__init__()

    def same_method(self):
        print('Esto es B')

Resultado esperado:

Esto es A
Esto es B

Este ejemplo funciona bien. Sin embargo, si el método se renombra a __same_method, el resultado es:

Esto es A

Parece que ejecuta A.__same_method en B.__init__.

Dado que mi proyecto principal contiene muchos métodos especiales (Dunder) y solo recientemente introduje la herencia, me preguntaba si hay alguna manera de hacer que esto funcione con los métodos especiales. ¿O es algo que realmente no debería hacer? ¿Cuál es la mejor práctica para los métodos de la clase hijo con una firma diferente?

(Estoy utilizando Python 3.9 con PyCharm 2021.2.3)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Al sobrescribir un método en una clase hija, es importante mantener la misma firma de método que la clase padre. Esto significa que el método de la clase hija debe aceptar el mismo número y tipo de argumentos que el método de la clase padre.

    Si se necesita cambiar la firma del método en la clase hija, un enfoque común es definir un nuevo método con un nombre diferente en lugar de sobrescribir el método padre. Esto permite seguir llamando al método padre desde la clase hija, si es necesario.

    En el ejemplo dado, si se necesita cambiar same_method en la clase hija B para que no reciba ningún argumento, sería mejor definir un nuevo método different_method en B en lugar de sobrescribir same_method y cambiar su firma. Esto permitiría llamar aún a same_method en la clase padre A desde B si es necesario, al mismo tiempo que permite que B tenga su propio método con una firma diferente.

    Aquí tienes un ejemplo de cómo se podría implementar esto:

    class A():
        def __init__(self, *some_input):
            self.same_method(*some_input)
    
        def same_method(self, *some_input):
            print(*some_input)
    
    
    class B(A):
        def __init__(self):
            super().__init__()
            self.different_method()
    
        def different_method(self):
            print('Esto es B')
    

    Con esta implementación, cuando se llama a B().__init__(), primero se llama al método __init__ de A, el cual a su vez llama a same_method con cualquier argumento pasado a B. Luego, B llama a su propio método different_method, que imprime “Esto es B”. La salida debería ser:

    Esto es A
    Esto es B
    

    Este enfoque permite tener métodos separados en las clases padre e hija con firmas diferentes, al mismo tiempo que permite que la clase hija llame al método padre si es necesario.

Comments are closed.