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.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para llamar a Left.__init__(x) y BottomRight.__init__(y) de forma separada y segura, puedes utilizar super() en combinación con llamadas explícitas a los constructores de las respectivas clases padre. Así es como puedes modificar el constructor de la clase Root para lograr esto:

    class Root(Left[X], BottomRight[Y], Generic[X, Y]):
      def __init__(self, x:X, y:Y):
        super(Left, self).__init__(x)
        super(BottomRight, self).__init__(y + y)
    

    En la primera llamada a super(), especificamos explícitamente la clase padre Left junto con el argumento self. Esto asegura que estemos llamando al método __init__() de Left y no de ninguna otra clase en la jerarquía de herencia. De manera similar, en la segunda llamada a super(), especificamos explícitamente la clase padre BottomRight 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.

Comments are closed.