2009-04-20 10 views
6

J'essaie de comprendre ce qui ne fonctionne pas dans ce code:Module Python Cmd, problème de sous-classement

#!/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() 

Voici l'erreur que je reçois

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 

Si je change la superclasse de « my_class "à un objet cela fonctionne bien. Où vais-je mal?

Répondre

7

cmd.Cmd n'est pas une nouvelle classe de style en Python 2.5, 2.6, 2.7.

Notez que votre code pas déclencher une exception dans Python 3.0.

+0

Est-ce parce que le module cmd est réécrit en Python 3? – Teifion

+0

Non. C'est parce que dans Python 3.0, toutes les classes sont des "classes de style nouveau". – Stephan202

+0

(En fait, un diff entre les cmd.py 2.5 et 3.0 vous montrera que très peu de changements ont été faits entre ces versions.) – Stephan202

2

Donc, si super() ne fonctionne pas l'utilisation:

import cmd 

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

Vous pouvez toujours utiliser super() si votre MyClass étend object. Cela fonctionne même si le module cmd.Cmd est et non une classe de nouveau style. Comme ceci:

#!/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

Ça marche aussi pour moi. Quelqu'un peut-il peser sur les effets secondaires bizarres dans Py2 ou Py3? – Technoloft