[Python] super(MyClass, self).__init__(*args, **kwargs)

Marco Giusti marco.giusti a posteo.de
Mer 17 Feb 2016 23:06:49 CET


On Wed, Feb 17 2016, Giuseppe Costanzi wrote:
> 2016-02-17 22:22 GMT+01:00 Dario Santomarco <dario.santomarco a gmail.com>:
> > 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
> 
> ho capito...grazie...
> 
> args = ('Y','Y','Z')
> kwargs = {'server':"127.0.0.1",
> 'user':"guest",'passw':"12345",'database':"genbank"}
> 
> foo = B(args, **kwargs)
> 
> bc a hal9000:~/stimuli$ python super.py
> MRO: ['B', 'A', 'object']
> __init__ class B: (('Y', 'Y', 'Z'),) {'passw': '12345', 'user':
> 'guest', 'server': '127.0.0.1', 'database': 'genbank'}
> __init__ class A: (('Y', 'Y', 'Z'),) {'database': 'genbank', 'passw':
> '12345', 'user': 'guest', 'server': '127.0.0.1'}
> super class B: (('Y', 'Y', 'Z'),) {'passw': '12345', 'user': 'guest',
> 'server': '127.0.0.1', 'database': 'genbank'}
> class: B
> kwargs : {'passw': '12345', 'user': 'guest', 'server': '127.0.0.1',
> 'database': 'genbank'}
> end
> 
> che e' quello che voglio
> grazie a tutti per la pazienza :(

Sei sicuro? al 100%? Hai controllato bene cosa è args in __init__? Una
tupla con un solo elemento che è una tupla di tre elementi.

Le due scritture non sono uguali:

    >>> ('Y','Y','Z') != (('Y', 'Y', 'Z'),)
    True

m.


Maggiori informazioni sulla lista Python