2009-10-23 12 views
8

mam tej klasy:Co powoduje, że "niezwiązana metoda __init __() musi zostać wywołana z instancją jako pierwszym argumentem" z tego kodu Pythona?

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) 

i wzywam go z tego skryptu:

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

i uzyskać ten błąd i nie mogę zrozumieć, dlaczego: unbound method __init__() must be called with instance as first argument

Odpowiedz

15

Robicie:

Thread.__init__() 

przeznaczenie:

Thread.__init__(self) 

Albo raczej używać super()

+6

To byłoby super (Wątek, self) .__ init __() '- ale super ma również swoje własne problemy:/ –

+2

@ THC4k: Super nie ma problemów, wiele dziedziczenia ma problemy. A jeśli korzystasz z dziedziczenia wielokrotnego, super jest o wiele lepsze niż połączenia bezpośrednie. – nikow

+0

super to po prostu przepis na katastrofę, szczególnie w przypadku dziedziczenia wielokrotnego, szczególnie jeśli istnieją rozszerzenia, które wymagają przeładowania. – dashesy

10

Jest to często zadawane pytanie w SO, ale odpowiedź, w skrócie, jest taka, że ​​sposób, w jaki nazywasz swojego konstruktora superklasy jest następujący:

super(Timer,self).__init__() 
1

Wystarczy przejść 'ja' jako argument „temat. init ". Potem działa na moich maszynach.

1

pierwsze, powód musi użyć:

Thread.__init__(self) 

zamiast

Thread.__init__() 

jest bo używasz nazwę klasy, a nie obiekt (instancja klasy), więc nie można wywołać metody w taki sam sposób, jak obiekt.

Po drugie, jeśli używasz Python 3, zalecany styl powołując się super metody klasy z klasy sub jest:

super().method_name(parameters) 

Chociaż w Pythonie 3 można użyć:

SuperClassName.method_name(self, parameters) 

To jest stary styl składni, który nie jest preferowany.

Powiązane problemy