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.

Crea una variable en una superclase, pero no sobrescribas la configuración del heredero.

Me gustaría tener una superclase que, como parte de su interfaz, provea una variable (o una función getter) y permita (pero no requiera) a una clase heredada establecer este valor. De la siguiente manera:

class A(object):
    def __init__(self):
        self._value = VALOR_POR_DEFECTO

    def value(self):
        return self._value

class B(A):
    def __init__(self, value):
        self._value = value
        super().__init__()

class C(A):
    def __init__(self):
        #nota: a esta clase no le importa establecer el valor
        super.__init__()

Sin embargo, la inicialización de super sobrescribirá cualquier configuración personalizada realizada por B. Si no lo establezco en la superclase y luego una clase hija no desea implementarlo, cualquier cosa que use esa variable fallará.

¿Cómo puedo crear esta variable en la superclase sin sobrescribir lo que una subclase pueda querer establecerla?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando una propiedad con un método setter en la superclase. Aquí tienes un ejemplo de implementación:

    class A:
        def __init__(self):
            self._value = DEFAULT_VALUE
    
        @property
        def value(self):
            return self._value
    
        @value.setter
        def value(self, new_value):
            self._value = new_value
    

    Ahora cualquier subclase que herede de A puede elegir utilizar la propiedad value y establecer su valor según sea necesario. Por ejemplo:

    class B(A):
        def __init__(self, value):
            super().__init__()
            self.value = value
    
    class C(A):
        def __init__(self):
            super().__init__()
            # no es necesario establecer el valor aquí, ya que es opcional
    

    En el ejemplo anterior, B establece la propiedad value en su constructor, mientras que C no lo hace. Si C u otra subclase no establece la propiedad value, aún tendrá el valor predeterminado de DEFAULT_VALUE establecido en el constructor de A.

Comments are closed.