Domanda

In Python 2.5, il codice seguente 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

Se sostituisco class X con class X(object), funzionerà. Qual è la spiegazione per questo?

È stato utile?

Soluzione

Il motivo è che super() opera solo su < a href = "https://docs.python.org/2/glossary.html#term-new-style-class" rel = "nofollow noreferrer"> nuove classi di stile , che nella versione 2.x serie significa che si estende da 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

Altri suggerimenti

Inoltre, non usare super () a meno che non sia necessario. Non è la & Quot per tutti gli usi; cosa giusta & Quot; a che fare con classi di nuovo stile che potresti sospettare.

Ci sono momenti in cui ti aspetti l'eredità multipla e potresti volerlo, ma fino a quando non conosci i dettagli pelosi dell'MRO, è meglio lasciarlo solo e attenersi a:

 X.a(self)

Nel caso in cui nessuna delle risposte sopra menzionate lo menzionasse chiaramente. La tua classe genitore deve ereditare da & Quot; oggetto & Quot ;, che essenzialmente lo trasformerebbe in una nuova classe di stile.

# 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

Ho provato i vari metodi X.a (); tuttavia, sembrano richiedere un'istanza di X per eseguire un (), quindi ho fatto X (). a (sé), che sembra più completo delle risposte precedenti, almeno per le applicazioni che ho incontrato. Non sembra essere un buon modo di gestire il problema in quanto vi sono costruzioni e distruzioni non necessarie, ma funziona bene.

La mia applicazione specifica era il modulo cmd.Cmd di Python, che evidentemente non è un oggetto NewStyle per qualche motivo.

Risultato finale:

X().a(self)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top