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)
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 hijaB
para que no reciba ningún argumento, sería mejor definir un nuevo métododifferent_method
enB
en lugar de sobrescribirsame_method
y cambiar su firma. Esto permitiría llamar aún asame_method
en la clase padreA
desdeB
si es necesario, al mismo tiempo que permite queB
tenga su propio método con una firma diferente.Aquí tienes un ejemplo de cómo se podría implementar esto:
Con esta implementación, cuando se llama a
B().__init__()
, primero se llama al método__init__
deA
, el cual a su vez llama asame_method
con cualquier argumento pasado aB
. Luego,B
llama a su propio métododifferent_method
, que imprime “Esto es B”. La salida debería ser: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.