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)