[Python] Estendere xmlrpclib.ServerProxy

Daniele Varrazzo piro a develer.com
Ven 5 Ott 2012 18:13:38 CEST


On 2012-10-05 16:43, Maurizio Totti wrote:
> Ciao,
> sono (da sempre) alle prime armi con Python e vorrei estendere la
> classe xmlrpclib.ServerProxy della libreria xmlrpclib (per usare un
> proxy http se definito sulla mia linuxbox), ma sbaglio qualcosa.
>
> Per esempio se provo anche solo a fare così:
>
> Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)
> [GCC 4.6.3] on linux2
> Type "help", "copyright", "credits" or "license" for more 
> information.
>>>> import xmlrpclib
>>>> class Pluto(xmlrpclib.ServerProxy):
> ...     def __init__(self, *args, **kw):
> ...         super(Pluto, self).__init__(self, *args, **kw)

Nota che dovrebbe essere

     super(Pluto, self).__init__(*args, **kw)

ma non è questo il problema.


>>>> b = Pluto("http://127.0.0.1/blog/xmlrpc.php")
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "<stdin>", line 3, in __init__
> TypeError: must be type, not classobj
>
> Cercando a giro ho trovato questo
> 
> http://stackoverflow.com/questions/489269/python-super-raises-typeerror-why
> e mi è venuto il dubbio che potrebbe dipendere anche da com'è fatta
> xmlrpclib... O forse ho semplicemente sbagliato :-)


Sì, il motivo è quello: è una classe "vecchio stile". Non supporta 
super (e non si comporta in maniera educata con l'ereditarietà 
multipla): devi usare

     xmlrpclib.ServerProxy.__init__(self, *args, **kw)

(questa volta il self lo devi passare esplicito, non come col super())


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python