Il seguente uso di super()
solleva un'eccezione TypeError: perché?super() solleva "TypeError: deve essere type, non classobj" per la classe new-style
>>> from HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
... def __init__(self):
... super(TextParser, self).__init__()
... self.all_data = []
...
>>> TextParser()
(...)
TypeError: must be type, not classobj
C'è una domanda simile su StackOverflow: Python super() raises TypeError, dove l'errore si spiega con il fatto che la classe utente non è un classe di nuovo stile. Tuttavia, la classe di cui sopra è un classe di nuovo stile, visto che eredita da object
:
>>> isinstance(HTMLParser(), object)
True
Che cosa mi manca? Come posso usare super()
, qui?
Utilizzare HTMLParser.__init__(self)
invece di super(TextParser, self).__init__()
funzionerebbe, ma mi piacerebbe capire l'errore TypeError.
PS: Joachim ha sottolineato che essere un'istanza di classe new-style non equivale a object
. Ho letto il contrario molte volte, quindi la mia confusione (esempio di test di istanze di classi di nuovo stile basato sul test di istanza object
: https://stackoverflow.com/revisions/2655651/3).
Grazie per la vostra domanda e risposta. Mi chiedo perché il 'super .__ doc__' di 2.7 non menzioni nulla di vecchio vs nuovo stile! – Kelvin
Grazie. :) Le docstring in genere contengono meno informazioni rispetto alla versione HTML completa della documentazione. Il fatto che 'super()' funzioni solo per classi (e oggetti) di nuovo stile è menzionato nel documento HTML (http: //docs.python.org/library/functions.html # super). – EOL
possibile duplicato di [python super() solleva TypeError! Perché?] (Http://stackoverflow.com/questions/489269/python-super-raises-typeerror-why) – user