¿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?
davy.ai
En el segundo bloque de código, se utiliza
def __init__(self, *args):
en la claseTest
y en la claseTest1
, en lugar dedef __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 queinstance_var
es un argumento requerido.Cuando se crea
child1 = Test(Foo)
, no se proporcionainstance_var
, pero se pasaFoo
como argumento. Dado queFoo
no tiene uninstance_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 pasaTest
como argumento, peroTest1
requiere*args
. Esto significa queTest1
espera al menos un argumento y le falta elinstance_var
requerido. Por eso se produce el errorTypeError: __init__() falta 1 argumento posicional requerido: 'instance_var'
.Para solucionar este error, puedes agregar un argumento
instance_var
al crearchild2
. Por ejemplo,child2 = Test1('quack')
funcionaría, donde'quack'
es el valor deinstance_var
. Dado queTest1
hereda deTest
, 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 queinstance_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.