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.

¿Qué arg puedo usar en lugar de `*args` en una instancia de herencia múltiple en child?

¿Qué argumento puedo usar en lugar de *args en la instancia hija? Por ejemplo, en este código:

class Foo:
    class_var = 'bar'
    def __init__(self):
        self.instance_var = 'baz'

class Test(Foo):
    def __init__(self, instance_var):
        Foo.__init__(self)
        self.new_instance = "duck"

child1 = Test(Foo) 
print("child1.instance_var: ", child1.instance_var)

La salida es:
child1.instance_var: baz

…pero cuando creo el siguiente hijo, el script solo funciona cuando cambio def __init__(self, instance_var): a def __init__(self, *args). Sin eso obtengo “TypeError: init() missing 1 required positional argument: ‘instance_var'”.

Este código funciona:

class Foo:
    class_var = 'bar'
    def __init__(self):
        self.instance_var = 'baz'

class Test(Foo):
    def __init__(self, *args):
        Foo.__init__(self)
        self.new_instance = "duck"

child1 = Test(Foo) 
print("child1.instance_var: ", child1.instance_var)

class Test1(Test):
    def __init__(self, *args):
        Test.__init__(self)
        self.new_instance = "new_duck"

child2 = Test1(Test)
print("child2.instance_var: ", child2.new_instance)

La salida es:

child1.instance_var: baz
child2.instance_var: new_duck

Pero esto no funciona:

class Foo:
    class_var = 'bar'
    def __init__(self):
        self.instance_var = 'baz'

class Test(Foo):
    def __init__(self, instance_var):
        Foo.__init__(self)
        self.new_instance = "duck"

child1 = Test(Foo) 
print("child1.instance_var: ", child1.instance_var)

class Test1(Test):
    def __init__(self, *args):
        Test.__init__(self)
        self.new_instance = "new_duck"

child2 = Test1(Test)
print("child2.instance_var: ", child2.new_instance)

No entiendo completamente por qué (¿dónde debo colocar instance_var para que el código no arroje un error?). ¿Cuál es la lógica: paso a paso?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En el segundo bloque de código, se utiliza def __init__(self, *args): en la clase Test y en la clase Test1, en lugar de def __init__(self, instance_var): utilizado en el primer ejemplo. La diferencia aquí es que *args es una forma de indicar que la función puede recibir cualquier número de argumentos (cero o más), mientras que instance_var es un argumento requerido.

    Cuando se crea child1 = Test(Foo), no se proporciona instance_var, pero se pasa Foo como argumento. Dado que Foo no tiene un instance_var, no es necesario y simplemente se establece en el valor predeterminado 'baz'. Por lo tanto, child1.instance_var devuelve correctamente 'baz'.

    Sin embargo, al crear child2 = Test1(Test), solo se pasa Test como argumento, pero Test1 requiere *args. Esto significa que Test1 espera al menos un argumento y le falta el instance_var requerido. Por eso se produce el error TypeError: __init__() falta 1 argumento posicional requerido: 'instance_var'.

    Para solucionar este error, puedes agregar un argumento instance_var al crear child2. Por ejemplo, child2 = Test1('quack') funcionaría, donde 'quack' es el valor de instance_var. Dado que Test1 hereda de Test, también hereda el parámetro *args y puede aceptar argumentos adicionales si es necesario.

    En general, lo importante es que *args permite que la función reciba cualquier número de argumentos, incluido cero, mientras que instance_var es un argumento requerido. Es importante proporcionar el tipo y número correcto de argumentos al crear instancias de una clase para evitar errores.

Comments are closed.