Python super () genera TypeError
-
20-08-2019 - |
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?
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)