2009-04-20 13 views
6

Sto cercando di capire cosa non funziona in questo codice:Python Cmd, problema sottoclassi

#!/usr/bin/python 

import cmd 

class My_class (cmd.Cmd): 
    """docstring for Twitter_handler""" 
    def __init__(self): 
     super(My_class, self).__init__() 

if __name__ == '__main__': 
    my_handler = My_class() 

Ecco l'errore che ottengo

Traceback (most recent call last): 
    File "main.py", line 12, in <module> 
    my_handler = My_class() 
    File "main.py", line 9, in __init__ 
    super(My_class, self).__init__() 
TypeError: super() argument 1 must be type, not classobj 

Se cambio la superclasse di "my_class "a un oggetto funziona bene. Dove sto andando male?

risposta

7

cmd.Cmd non è una nuova classe di stile in Python 2.5, 2.6, 2.7.

Nota che il tuo codice fa non genera un'eccezione in Python 3.0.

+0

È perché il modulo cmd viene riscritto in Python 3? – Teifion

+0

No. È perché in Python 3.0 tutte le classi sono "nuove classi di stile". – Stephan202

+0

(In realtà, un diff tra 2,5 e 3.0 cmd.py ti mostrerà che sono state apportate pochissime modifiche tra quelle versioni.) – Stephan202

2

Quindi, se super() non funziona uso:

import cmd 

class My_class(cmd.Cmd): 
    def __init__(self): 
     cmd.Cmd.__init__(self) 
1

È comunque possibile utilizzare super() se il vostro MyClass estende object. Ciò funziona anche se il modulo cmd.Cmd è non una classe di nuovo stile. In questo modo:

#!/usr/bin/python 

import cmd 

class My_class (cmd.Cmd, object): 
    """docstring for Twitter_handler""" 
    def __init__(self): 
     super(My_class, self).__init__() 

if __name__ == '__main__': 
    my_handler = My_class() 
+0

Questo funziona anche per me. Qualcuno può valutare alcuni strani effetti collaterali in Py2 o Py3? – Technoloft