Cómo llamar de manera segura a los súper constructores con diferentes argumentos.
He visto que se utiliza super().__init__(*args)
para llamar al constructor super de forma segura (de manera que no falle al heredar en forma de diamante). Sin embargo, no puedo encontrar una forma de llamar a diferentes constructores super con diferentes argumentos de esta manera.
Aquí tienes un ejemplo que ilustra el problema.
from typing import TypeVar, Generic
X = TypeVar("X")
Y = TypeVar("Y")
class Base:
def __init__(self):
pass
class Left(Base, Generic[X]):
def __init__(self, x:X):
super().__init__()
self.lft = x
class TopRight(Base, Generic[Y]):
def __init__(self, y:Y):
super().__init__()
self.rgh = y
class BottomRight(TopRight[Y], Generic[Y]):
def __init__(self, y:Y):
super().__init__(y + y)
class Root(Left[X], BottomRight[Y], Generic[X, Y]):
def __init__(self, x:X, y:Y):
pass #issue here
¿Cómo puedo llamar a Left.__init__(x)
y BottomRight.__init__(y)
por separado y de manera segura?
davy.ai
Para llamar a
Left.__init__(x)
yBottomRight.__init__(y)
de forma separada y segura, puedes utilizarsuper()
en combinación con llamadas explícitas a los constructores de las respectivas clases padre. Así es como puedes modificar el constructor de la claseRoot
para lograr esto:En la primera llamada a
super()
, especificamos explícitamente la clase padreLeft
junto con el argumentoself
. Esto asegura que estemos llamando al método__init__()
deLeft
y no de ninguna otra clase en la jerarquía de herencia. De manera similar, en la segunda llamada asuper()
, especificamos explícitamente la clase padreBottomRight
para llamar a su método__init__()
.Al hacer esto, podemos llamar de forma segura a los constructores de las clases padre con los argumentos requeridos sin encontrarnos con el problema del diamante.