2009-10-23 8 views
8

Ho questa classe:Cosa sta causando "metodo non associato __init __() deve essere chiamato con istanza come primo argomento" da questo codice Python?

from threading import Thread 
import time 

class Timer(Thread): 
    def __init__(self, interval, function, *args, **kwargs): 
     Thread.__init__() 
     self.interval = interval 
     self.function = function 
     self.args = args 
     self.kwargs = kwargs 
     self.start() 

    def run(self): 
     time.sleep(self.interval) 
     return self.function(*self.args, **self.kwargs) 

e chiamo con questo script:

import timer 
    def hello(): 
     print \"hello, world 
    t = timer.Timer(1.0, hello) 
    t.run() 

e ottenere questo errore e io non riesco a capire perché: unbound method __init__() must be called with instance as first argument

risposta

15

Si sta facendo:

Thread.__init__() 

Usa:

Thread.__init__(self) 

O, piuttosto, utilizzare super()

+6

Sarebbe 'super (Thread, self) .__ init __()' - ma super ha anche i suoi problemi:/ –

+2

@ THC4k: Super non ha problemi, l'ereditarietà multipla ha problemi. E se usi l'ereditarietà multipla, allora super è molto meglio delle chiamate dirette. – nikow

+0

super è solo una ricetta per il disastro, specialmente nell'ereditarietà multipla, specialmente se esistono estensioni che necessitano di essere ricaricate. – dashesy

10

Questo è un domande frequenti su SO, ma la risposta, in breve, è che il modo in cui chiamate il costruttore della vostra superclasse è come:

super(Timer,self).__init__() 
1

Hai solo bisogno di passare 'sé' come argomento di 'discussione. init '. Dopo di ciò, funziona sulle mie macchine.

1

In primo luogo, il motivo è necessario utilizzare:

Thread.__init__(self) 

invece di

Thread.__init__() 

è perché si sta utilizzando il nome della classe, e non un oggetto (un'istanza della classe), in modo da non puoi chiamare un metodo allo stesso modo di un oggetto.

In secondo luogo, se si sta utilizzando Python 3, lo stile consigliato per invocare un metodo di classe eccellente da una classe sub è:

super().method_name(parameters) 

Anche se in Python 3 è possibile utilizzare:

SuperClassName.method_name(self, parameters) 

È un vecchio stile di sintassi che non è lo stile preferito.

Problemi correlati