Python super () plantea TypeError
-
20-08-2019 - |
Pregunta
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 el class X
con class X(object)
, funcionará. ¿Cuál es la explicación de esto?
Solución
La razón es que super()
solo opera en < a href = "https://docs.python.org/2/glossary.html#term-new-style-class" rel = "nofollow noreferrer"> clases de estilo nuevo , que en el 2.x serie significa extender desde 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
Otros consejos
Además, no use super () a menos que tenga que hacerlo. No es el propósito general & "; Lo correcto &"; que ver con clases de estilo nuevo que sospechas.
Hay momentos en los que espera una herencia múltiple y es posible que lo desee, pero hasta que conozca los detalles peludos del MRO, es mejor dejarlo solo y seguir:
X.a(self)
En caso de que ninguna de las respuestas anteriores lo mencionara claramente. Su clase padre necesita heredar de & Quot; object & Quot ;, lo que esencialmente la 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
Probé los diversos métodos X.a (); sin embargo, parecen requerir una instancia de X para realizar a (), así que hice X (). a (self), 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 una construcción y destrucción innecesarias, pero funciona bien.
Mi aplicación específica fue el módulo cmd.Cmd de Python, que evidentemente no es un objeto NewStyle por alguna razón.
Resultado final:
X().a(self)