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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top