[Python] super(MyClass, self).__init__(*args, **kwargs)
Dario Santomarco
dario.santomarco a gmail.com
Mer 17 Feb 2016 22:22:22 CET
Il 17/02/2016 19.59, Giuseppe Costanzi ha scritto:
> salve a tutti,
> non riesco a capire come usare *args, **kwargs in una classe.
> mi sono fatto uno script che riporto sotto ma, ad esempio mi perdo
> kwargs per strada mentre gli args proprio non li vedo da dentro la classe.
> lo script sotto mi ritorna
>
> bc a hal9000:~/stimuli$ python super.py
> MRO: ['B', 'A', 'object']
> __init__ class B: ({1: 'A', 2: 'B', 3: 'C'},) {}
> __init__ class A: ({1: 'A', 2: 'B', 3: 'C'},) {}
> super class B: ({1: 'A', 2: 'B', 3: 'C'},) {}
> class: B
> kwargs : {}
> end
>
> che non ho capito?
>
> import sys
>
> class A(object):
> def __init__(self,*args, **kwargs):
> print "__init__ class A: %s %s"%(args,kwargs)
>
> class B(A):
> def __init__(self,arg, *args, **kwargs):
> print "__init__ class B: %s %s" %(args, kwargs)
> super(B, self).__init__(*args, **kwargs)
> print "super class B: %s %s" %(args, kwargs)
>
> self.kwargs = kwargs
>
>
> def __str__(self):
> return "class: %s\nkwargs : %s" % (self.__class__.__name__,
> self.kwargs,)
>
> def main():
>
> print "MRO:", [x.__name__ for x in B.__mro__]
>
>
> args = ('Y','Y','Z')
> kwargs = {1:"A", 2:"B", 3:"C"}
>
> foo = B(args, kwargs)
>
> print foo
>
> raw_input('end')
>
> if __name__ == "__main__":
> main()
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
Ciao, ci sono i seguenti errori:
Tua - kwargs = {1:"A", 2:"B", 3:"C"}
Corretta - kwargs = {'1':"A", '2':"B", '3':"C"} # le chiavi del
dizionario DEVONO essere stringhe
Per le altre due ci sono due opzioni
Questa ha più senso:
Tua - def __init__(self,arg, *args, **kwargs): #quel arg
sembra un errore di battitura, non ha molto senso in quella posizione
Corretta -def __init__(self, *args, **kwargs):
Tua - foo = B(args, kwargs)
Tua - foo = B(args, **kwargs) # se glielo passi senza i
doppi asterischi gli stai passando un oggetto dict che va a finire come
lista di argomenti catturata da *args, devi spacchettarlo con **
Questa ha meno senso:
Tua - def __init__(self,arg, *args, **kwargs): #supponendo
ci siano motivi particolari per cui vuoi tenere il tutto com'è
Tua - foo = B(args, kwargs)
Corretta - foo = B(*args, **kwargs) # devi spacchettare
args altrimenti viene catturata da arg come oggetto tupla.
spacchettandola accade che la prima 'Y' va ad arg e le restanti due
lettere ad *args
--
Dario Santomarco
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20160217/5cc3310b/attachment.html>
Maggiori informazioni sulla lista
Python