type not must multiple init__ def comando classobj argument python inheritance python-2.x super

not - Python super() aumenta TypeError



super python 3 (4)

Además, no use super () a menos que sea necesario. No es la "cosa correcta" de propósito general que hacer con las clases de nuevo estilo que pueda sospechar.

Hay momentos en los que está esperando una herencia múltiple y es posible que lo desee, pero hasta que sepa los detalles capilares de la MRO, lo mejor es dejarlo en paz y apegarse a:

X.a(self)

En Python 2.5, el siguiente código genera un TypeError :

>>> class X: def a(self): print "a" >>> class Y(X): def a(self): super(Y,self).a() print "b" >>> c = Y() >>> c.a() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in a TypeError: super() argument 1 must be type, not classobj

Si reemplazo la class X con class X(object) , funcionará. ¿Cuál es la explicación para esto?


En caso de que ninguna de las respuestas anteriores lo mencionara claramente. Tu clase principal debe heredar de "objeto", lo que esencialmente lo convertiría en una nueva clase de estilo.

# python 3.x: class ClassName(object): # This is a new style class pass class ClassName: # This is also a new style class ( implicit inheritance from object ) pass # Python 2.x: class ClassName(object): # This is a new style class pass class ClassName: # This is a old style class pass


La razón es que super() solo opera en clases de estilo nuevo , lo que en la serie 2.x significa extender desde el object :

>>> class X(object): def a(self): print ''a'' >>> class Y(X): def a(self): super(Y, self).a() print ''b'' >>> c = Y() >>> c.a() a b


Probé los diversos métodos Xa (); sin embargo, parecen requerir una instancia de X para realizar un (), así que hice X (). a (uno mismo), que parece más completo que las respuestas anteriores, al menos para las aplicaciones que he encontrado. No parece ser una buena forma de manejar el problema, ya que hay construcción y destrucción innecesarias, pero funciona bien.

Mi aplicación específica era el módulo cmd.Cmd de Python, que evidentemente no es un objeto NewStyle por algún motivo.

Resultado final:

X().a(self)