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

Giuseppe Costanzi giuseppecostanzi a gmail.com
Mer 17 Feb 2016 22:46:10 CET


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 :(


> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>


Maggiori informazioni sulla lista Python