[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